在给定的时间预算后停止函数调用[重复]

Posted

技术标签:

【中文标题】在给定的时间预算后停止函数调用[重复]【英文标题】: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 中实现这一点?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在给定的时间预算后停止函数调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

android - 在给定的时间后只调用一次通知

限制函数调用的时间[重复]

Python:如何在第一次调用后停止我的函数值更改(时间序列)

C# - 在一些计算后从另一个构造函数调用构造函数[重复]

编写一个函数prt(c,n),重复打印给定的字符c,n次。在主函数中调用prt(c,n)函数,打印一个直角三角形。

AWS lambda 函数在超时错误后停止工作