gpt4 book ai didi

python - 在给定的时间后终止功能?

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:04 24 4
gpt4 key购买 nike

在 Python 中,在给定时间后终止函数(仍在运行)的最佳方法是什么?到目前为止,这是我发现的两种方法:

假设这是我们的基本功能:

import time
def foo():
a_long_time = 10000000
time.sleep(a_long_time)

TIMEOUT = 5 # seconds

<强>1。多处理方法

import multiprocessing

if __name__ == '__main__':
p = multiprocessing.Process(target=foo, name="Foo")
p.start()

p.join(TIMEOUT)

if p.is_alive()
print('function terminated')
p.terminate()
p.join()

<强>2。信号方法

import signal

class TimeoutException(Exception):
pass

def timeout_handler(signum, frame):
raise TimeoutException

signal.signal(signal.SIGALRM, timeout_handler)


signal.alarm(TIMEOUT)
try:
foo()
except TimeoutException:
print('function terminated')

这两种方法在适用范围、安全性和可用性方面各有什么优势和劣势?有没有更好的方法?

最佳答案

嗯,一如既往,这取决于。

您可能已经验证过,这两种方法都有效。我会说这取决于你的应用程序和正确的实现(你的信号方法有点不对......)

如果正确实现,这两种方法都可以被认为是“安全的”。这取决于 foo 函数之外的主程序是否需要执行某些操作,或者它是否可以坐等 foo 完成或超时。信号方法不允许任何并行处理,因为您的主程序将在 foo() 中,直到它完成或超时。但是你需要消除信号。如果你的 foo 在一秒钟内完成,你的主程序离开 try/except 结构,四秒钟后...... kaboom ... 引发异常并且可能未被捕获。不好。

try:
foo()
signal.alarm(0)
except TimeoutException:
print ("function terminated")

解决问题。

我个人更喜欢多处理方法。它更简单,不需要信号和异常处理,理论上,如果您的程序执行不在您期望的位置,则发出信号时可能会出错。如果您的程序可以在 join() 中等待,那么您就完成了。但是,如果你想在等待的时候在主进程中做一些事情,你可以进入一个循环,在一个变量中跟踪时间,检查是否超时,如果超时,则终止进程。如果进程仍在运行,您只需使用带有微小超时的连接来“查看”。

另一种方法,取决于您的 foo(),是使用具有类或全局变量的线程。如果您的 foo 一直在处理命令,而不是等待命令完成很长时间,您可以在其中添加一个 if 子句:

def foo():
global please_exit_now
while True:
do_stuff
do_more_stuff
if foo_is_ready:
break
if please_exit_now is True:
please_exit_now = False
return
finalise_foo
return

如果 do_stuff 和 do_more_stuff 在合理的时间内完成,您就可以在主程序中处理事情并将全局 please_exit_now 设置为 True,您的线程最终会注意到这一点并退出。

不过,我可能会选择你的多处理并加入。

汉奴

关于python - 在给定的时间后终止功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40915527/

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