【问题标题】:How to get precise timeout with Python multiprocess apply_async?如何使用 Python 多进程 apply_async 获得精确的超时?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多