多处理提前退出
Multiprocessing Early Exit
我有一个循环正在检查计算结果为 True
:
的值的第一个实例
for i in l:
if fun(i):
return i
return None
我想使用多处理池加快速度,但我的理解是池只会 运行 fun
处理 l
中的每个元素。有没有办法在池化时做某种"short-circuit"?
这就是 terminate
方法的用途,但您必须小心使用它。它会杀死工作进程,但令人惊讶的是它不会阻止您永远阻塞等待呼叫。因此,您只能在进行 apply_async
或 imap_unordered
调用时使用它。从另一个线程关闭通常会导致您对池的调用挂起。在此示例中,我将 chunksize
设置为 1,如果单个工作项有大量处理,这是首选值。如果工作项成本较低并且您不介意在完成之前处理更多项,则可以将 chunksize
设置为更大的值。但是不要使用默认值...必须在任何东西返回给您之前处理必须的项目。
import multiprocessing
def worker(item):
print(item)
return item
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
for i in pool.imap_unordered(worker, range(100), chunksize=1):
if i == 10:
print('terminate')
pool.terminate()
break
print('done')
我有一个循环正在检查计算结果为 True
:
for i in l:
if fun(i):
return i
return None
我想使用多处理池加快速度,但我的理解是池只会 运行 fun
处理 l
中的每个元素。有没有办法在池化时做某种"short-circuit"?
这就是 terminate
方法的用途,但您必须小心使用它。它会杀死工作进程,但令人惊讶的是它不会阻止您永远阻塞等待呼叫。因此,您只能在进行 apply_async
或 imap_unordered
调用时使用它。从另一个线程关闭通常会导致您对池的调用挂起。在此示例中,我将 chunksize
设置为 1,如果单个工作项有大量处理,这是首选值。如果工作项成本较低并且您不介意在完成之前处理更多项,则可以将 chunksize
设置为更大的值。但是不要使用默认值...必须在任何东西返回给您之前处理必须的项目。
import multiprocessing
def worker(item):
print(item)
return item
if __name__ == "__main__":
with multiprocessing.Pool(4) as pool:
for i in pool.imap_unordered(worker, range(100), chunksize=1):
if i == 10:
print('terminate')
pool.terminate()
break
print('done')