gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:37 26 4
gpt4 key购买 nike

场景 - 我有一个正在分配任务的进程池。但是,如果子进程在运行任务时被终止,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 中的更多示例.

关于python - 我如何判断 AsyncResult 是否永远不会准备好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com