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)
通话结束而不需要等待超时?另外,我如何判断它已被放弃,而不仅仅是任务仍在运行但我们已达到超时?
如果进程意外终止,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)
文档中有更多示例。
归档时间: |
|
查看次数: |
2845 次 |
最近记录: |