场景 – 我有一个我正在完成任务的进程池.但是,如果在运行任务时终止了子进程,则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中有更多例子.