gpt4 book ai didi

python - 您如何保护自己免受可能无限期挂起的不稳定的库调用的影响?

转载 作者:太空狗 更新时间:2023-10-29 23:57:54 25 4
gpt4 key购买 nike

假设您发现自己处于依赖于行为不佳的库的不幸境地。您的代码需要调用 FlakyClient.call(),但有时该函数最终会挂起一段 Not Acceptable 时间。

如下所示,解决此问题的一种方法是将调用包装在它自己的Process 中,并使用join 方法中的超时参数来定义最大数量的您愿意在 FlakyClient 上等待的时间。这提供了一个很好的保障,但它也阻止了代码的主体对调用 FlakyClient.call() 的结果使用react。我所知道的解决这个其他问题(将结果放入代码主体)的唯一方法是使用一些繁琐的 IPC 技术。

处理这两个问题的干净和 pythonic 方法是什么?我想在库调用挂起时保护自己,并在调用完成时能够使用结果。

谢谢!

from multiprocessing import Process
from flaky.library import FlakyClient


TIMEOUT_IN_SECS = 10

def make_flaky_call():
result = FlakyClient.call()

proc = Process(target=make_flaky_call)
proc.start()
proc.join(TIMEOUT_IN_SECS)
if proc.is_alive():
proc.terminate()
raise Exception("Timeout during call to FlakyClient.call().")

最佳答案

我不能说 Python 2.7,但在 Python 3 中,正确处理这个问题的方法是使用 asynciofutures 的概念.

import concurrent

def make_flaky_call():
return FlakyClient.call()

timeout = 10

with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(make_flaky_call) # get a future object
try:
result = await future.result(timeout = timeout)
except concurrent.futures.TimeOutError:
# if a timeout occurs on the call, do something
result = None # default value

这相当 Pythonic。您可以将其与代码的主体集成。它正确地使用 try-except 进行错误处理。它带有内置超时。它仅适用于 Python 3.5(感谢 await - 但更改为 yield from 使其与 Python 3.4 兼容)。

不幸的是,对于 Python 2.7,处理该问题的正确方法是执行您当前正在执行的操作。

关于python - 您如何保护自己免受可能无限期挂起的不稳定的库调用的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36903966/

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