import multiprocessing as mp
pool = mp.Pool()
def calc(i):
return i * 2
def done(results):
for result in results:
print(result)
def loop():
pool.map_async(calc, [0, 1, 2, 3], callback = done):
while True:
loop()
我使用的是这个简化示例中描述的线程池设置.它按预期工作:主循环要求池在每次运行时通过map_async
计算一组结果,池使用calc
函数来处理给定的项目,当准备就绪时,调用done
函数,其中包含所有结果的列表,在这种情况下总是[0, 2, 4, 6]
.
我想实现的目标:我希望线程池在任何结果完成处理时运行回调函数,或者将其添加到主线程可以随时查看和修改的列表中.在计算出最后一个结果后,池停止调用回调,直到主循环再次触发它并重复该过程.
目标是让工作线程尽可能快地提交处理后的结果,让主线程在执行时找到尽可能多的结果,即使它们还没有全部准备好.使用result.get()
不是一个选项,因为获取结果不能阻塞主线程,如果你想在同步模式下运行,这是一个可选的设置.我很好使用池中定义的回调,或者将每个完成的结果添加到数组中,只要主循环可以看到并处理完成的项目,然后丢弃.
值得注意的是,主线程并不强制将数组提供给线程池,[0, 1, 2, 3]
是类中的常量变量,但calc
函数工作的其他变量需要在每次调用时从主线程更新.每个线程都会分配一个项目...例如,我的数组假设有4个进程,每个进程都负责计算其中一个数字.我不指望它能像我想象的那样工作,但请让我知道什么是最接近的.