【发布时间】:2019-06-01 16:21:12
【问题描述】:
我正在使用多进程池来并行运行一批作业。我想给每个工作 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 函数的用法有一些误解吗?还是有更好的方法来实现我想做的事情?
【问题讨论】:
-
您检查第一个结果的超时时间为 2 秒,但它失败了,因为该结果还有 1 秒的时间。然后,您检查第二个结果是否有 2 秒超时,并在 1 秒后成功 - 因为它在第一次超时期间已经运行了 2 秒。
标签: python python-multiprocessing python-pool