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

Rob*_*tts 5 python python-2.7 python-multiprocessing

场景 - 我有一个正在分配任务的进程池。但是,如果子进程在运行任务时被终止,则该AsyncResult对象永远不会被标记为就绪。我希望发生的情况是它会被标记为就绪但不成功。

要重现这一点:

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

在另一个 shell 中,找到进程 ID 并将其杀死。

>>> result.ready()
False
>>> result.wait(5) # Waits 5 seconds even though subprocess is dead
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为我有一个线程正在等待作业完成,并且它通常有相当长的超时。如何让result.wait(timeout)通话结束而不需要等待超时?另外,我如何判断它已被放弃,而不仅仅是任务仍在运行但我们已达到超时?

nox*_*fox 2

如果进程意外终止,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
Run Code Online (Sandbox Code Playgroud)

文档中有更多示例。