python – 如何判断AsyncResult是否永远不会准备好?

场景 – 我有一个我正在完成任务的进程池.但是,如果在运行任务时终止了子进程,则AsyncResult对象永远不会被标记为就绪.我希望会发生的是它会被标记为准备好并且不成功.

要重现这个:

>>> import multiprocessing
>>> import time
>>> p = multiprocessing.Pool(processes=1)
>>> result = p.apply_async(time.sleep, args=(1000,))
>>> result.ready()
False

在另一个shell中,找到进程ID并将其终止.

>>> result.ready()
False
>>> result.wait(5) # Waits 5 seconds even though subprocess is dead

这是一个问题,因为我有一个线程在等待工作完成,它通常有一个相当长的超时.如何在不需要等待超时的情况下完成result.wait(timeout)调用?另外,我怎么知道它已被放弃,而不仅仅是任务仍在运行但是我们达到了超时?

最佳答案 如果进程意外死亡,
Pebble库会通知您.它还支持超时和回调.

这是你的榜样.

from pebble import ProcessPool
from concurrent.futures import TimeoutError

with ProcessPool() as pool:
    future = pool.schedule(time.sleep, args=(1000,), timeout=100)

    try:
        results = future.result()
        print(results)
    except TimeoutError as error:
        print("Function took longer than %d seconds" % error.args[1])
    except ProcessExpired as error:
        print("%s. Exit code: %d" % (error, error.exitcode))
    except Exception as error:
        print("function raised %s" % error)
        print(error.traceback)  # Python's traceback of remote process

documentation中有更多例子.

点赞