我想打电话foo(n)
但如果它运行超过 10 秒就停止它。有什么好方法可以做到这一点?
我可以看到,理论上我可以修改foo
自己以定期检查它已经运行了多长时间,但我不希望这样做。
我想打电话foo(n)
但如果它运行超过 10 秒就停止它。有什么好方法可以做到这一点?
我可以看到,理论上我可以修改foo
自己以定期检查它已经运行了多长时间,但我不希望这样做。
干得好:
import multiprocessing
import time
# Your foo function
def foo(n):
for i in range(10000 * n):
print "Tick"
time.sleep(1)
if __name__ == '__main__':
# Start foo as a process
p = multiprocessing.Process(target=foo, name="Foo", args=(10,))
p.start()
# Wait 10 seconds for foo
time.sleep(10)
# Terminate foo
p.terminate()
# Cleanup
p.join()
这将等待 10 秒,foo
然后将其杀死。
更新
仅当进程正在运行时才终止该进程。
# If thread is active
if p.is_alive():
print "foo is running... let's kill it..."
# Terminate foo
p.terminate()
更新 2:推荐
join
与 一起使用timeout
。如果foo
在超时之前完成,则 main 可以继续。
# Wait a maximum of 10 seconds for foo
# Usage: join([timeout in seconds])
p.join(10)
# If thread is active
if p.is_alive():
print "foo is running... let's kill it..."
# Terminate foo
p.terminate()
p.join()
import signal
#Sets an handler function, you can comment it if you don't need it.
signal.signal(signal.SIGALRM,handler_function)
#Sets an alarm in 10 seconds
#If uncaught will terminate your process.
signal.alarm(10)
超时不是很精确,但如果您不需要极高的精度,可以这样做。
另一种方法是使用资源模块,并设置最大 CPU 时间。