我正在使用多进程池并行运行一批作业。我想给每个工作2秒的时间限制。也就是说,如果要花费超过2秒的时间,我想终止该工作,然后继续下一个工作。
这是我的代码
from multiprocessing import Pool, TimeoutError
import time
import os
import random
def f():
time.sleep(3)
return True
if __name__ == '__main__':
with Pool(processes=8) as pool:
multiple_results = [pool.apply_async(f, ()) for i in range(16)]
for res in multiple_results:
try:
print (res.get(timeout=2)),
except:
print ("TO"),
我希望可以打印16个 TO ,但是,我得到的是 TO True True True True ... ,这意味着函数f的大多数执行成功了。我没想到这一点,因为我认为我为每个生成的进程设置了2秒超时。 我对apply_async函数的用法有误解吗?还是有更好的方法来实现我想做的事?
答案 0 :(得分:1)
AsyncResult.get
函数的超时不会终止正在进行的作业。它只会阻塞直到timeout
秒,然后引发TimeoutError
,使主线程恢复执行。
因此,在等待第一个结果时,所有其他入队作业都会在后台正确处理,因此您会观察到这种行为。