如何使用Python多进程apply_async获得精确的超时?

时间:2019-01-06 23:49:24

标签: python python-multiprocessing python-pool

我正在使用多进程池并行运行一批作业。我想给每个工作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函数的用法有误解吗?还是有更好的方法来实现我想做的事?

1 个答案:

答案 0 :(得分:1)

AsyncResult.get函数的超时不会终止正在进行的作业。它只会阻塞直到timeout秒,然后引发TimeoutError,使主线程恢复执行。

因此,在等待第一个结果时,所有其他入队作业都会在后台正确处理,因此您会观察到这种行为。

如果您希望作业在超时时停止,则需要依赖第三方池实现,例如billiardpebble