【问题标题】:Making function call stop after given time budget [duplicate]在给定的时间预算后停止函数调用[重复]
【发布时间】:2020-06-17 08:55:26
【问题描述】:

我有三个函数 f1(x)、f2(x) 和 f3(x) 返回结果(想象 API 调用,无法控制函数)。这些函数在调用时可能需要一段不确定的时间才能结束(但通常在 1 秒以内)。现在我需要调用所有这些函数并选择最佳结果,但在我需要在最大 t 毫秒内返回一些结果的约束下。伪代码:

def select_result(x, max_t):
    r1 = f1(x) # but stop if it takes longer than max_t miliseconds
    r2 = f2(x) # but stop if it takes longer than max_t miliseconds
    r3 = f3(x) # but stop if it takes longer than max_t miliseconds
    return max(r1, r2, r3) # or None if it took too long

如何在 Python 中实现这一点?

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    您可以为每个函数调用使用一个子进程。 subprocess.run() 方法接受一个超时参数,该参数是直到孩子被杀死的秒数。来自文档:

    超时参数被传递给 Popen.communicate()。如果超时,子进程将被杀死并等待。 TimeoutExpired 异常将在子进程终止后重新引发。

    因此有必要处理TimeoutExpired 异常,如果任何进程最终超出超时限制,则会引发这些异常。

    另一种选择是使用信号来设置计时器并发送SIGLARM。这样做的好处是破坏性较小,因为您可以修改被调用的函数以在信号到来时正确处理信号,从而使它们有机会干净地关闭。缺点是信号可能难以编程,而 subprocess 选项是一个非常独立的解决方案,开箱即用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      相关资源
      最近更新 更多