![](/img/trans.png)
[英]how to get a realtime return value from an infinite loop thread in Python 3
[英]How to get return value from thread in Python?
我在python中执行了一些计算量大的任务,并找到了用于并行化的线程模块。 我有一个函数进行计算并返回一个ndarray作为结果。 现在,我想知道如何使函数并行化并从每个线程取回计算出的数组。
后面的示例通过光照函数和计算得到了大大简化。
import numpy as np
def calculate_result(input):
a=np.linspace(1.0, 1000.0, num=10000) # just an example
result = input*a
return(result)
input =[1,2,3,4]
for i in range(0,len(input(i))):
t.Thread(target=calculate_result, args=(input))
t. start()
#Here I want to receive the return value from the thread
我正在寻找一种从每个线程的线程/函数获取返回值的方法,因为在我的任务中,每个线程都会计算不同的值。
我发现了另一个问题( 如何从python中的线程获取返回值? ),有人正在寻找类似的问题(没有ndarrays),并且使用ThreadPool和async处理...
感谢您的回答! 由于您现在的帮助,我正在寻找一种解决多处理模块问题的方法。 为了使您更好地理解我的工作,请参阅以下说明。
说明:
我的'input_data'是一个ndarray,具有282240个类型为uint32的元素
在'calculation_function()'中,我使用一个for循环从每12位开始计算结果并将其放入'output_data'
因为这非常慢,所以我将input_data分为4或8个部分,并在Calculation_function()中计算每个部分。
现在我正在寻找一种方法,如何使4或8个函数调用并行化
数据的顺序是基本的,因为数据在图像中,每个像素必须位于正确的位置。 因此,函数调用号。 1计算第一个和最后一个函数调用图像的最后一个像素。
计算工作正常,可以从我的算法中完全重建图像,但是我需要并行化以加快对时间要求严格的方面。
摘要:一个输入ndarray分为4或8部分。 每个部分都有70560或35280 uint32值。 从每个12位,我可以计算出4个或8个函数调用的一个Pixel。 每个函数返回一个188160或94080像素的ndarray。 所有返回值将排成一排,并重塑为图像。
万事俱备:计算已经万事俱备,我可以重建自己的形象
问题:函数调用是串行执行的,但是每次图像重建都很慢
主要目标:通过使函数调用并行化来加速函数调用。
码:
def decompress(payload,WIDTH,HEIGHT):
# INPUTS / OUTPUTS
n_threads = 4
img_input = np.fromstring(payload, dtype='uint32')
img_output = np.zeros((WIDTH * HEIGHT), dtype=np.uint32)
n_elements_part = np.int(len(img_input) / n_threads)
input_part=np.zeros((n_threads,n_elements_part)).astype(np.uint32)
output_part =np.zeros((n_threads,np.int(n_elements_part/3*8))).astype(np.uint32)
# DEFINE PARTS (here 4 different ones)
start = np.zeros(n_threads).astype(np.int)
end = np.zeros(n_threads).astype(np.int)
for i in range(0,n_threads):
start[i] = i * n_elements_part
end[i] = (i+1) * n_elements_part -1
# COPY IMAGE DATA
for idx in range(0,n_threads):
input_part [idx,:] = img_input[start[idx]:end[idx]+1]
for idx in range(0,n_threads): # following line is the function_call that should be parallized
output_part[idx,:] = decompress_part2(input_part[idx],output_part[idx])
# COPY PARTS INTO THE IMAGE
img_output[0 : 188160] = output_part[0,:]
img_output[188160: 376320] = output_part[1,:]
img_output[376320: 564480] = output_part[2,:]
img_output[564480: 752640] = output_part[3,:]
# RESHAPE IMAGE
img_output = np.reshape(img_output,(HEIGHT, WIDTH))
return img_output
请不要照顾我的初学者编程风格:)只是在寻找一种解决方案,该方法如何使用多处理模块使函数调用并行化并返回返回ndarrays。
非常感谢你的帮助 !
您可以使用多处理模块中的进程池
def test(a):
return a
from multiprocessing.dummy import Pool
p = Pool(3)
a=p.starmap(test, zip([1,2,3]))
print(a)
p.close()
p.join()
kar的答案有效,但是请记住,他正在使用.dummy模块,该模块可能受到GIL的限制。 有关此的更多信息: Python中的multiprocessing.dummy没有利用100%cpu
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.