在给定的时间预算后停止函数调用[重复]
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 选项是一个非常独立的解决方案,开箱即用。
【讨论】:
以上是关于在给定的时间预算后停止函数调用[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在第一次调用后停止我的函数值更改(时间序列)