在时间段后停止代码

fel*_*ipa 30 python

foo(n)如果它运行超过10秒钟我想打电话但是停止它.这样做的好方法是什么?

我可以看到我理论上可以修改foo自己以定期检查它运行了多长时间,但我宁愿不这样做.

ATO*_*TOA 38

干得好:

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()
Run Code Online (Sandbox Code Playgroud)

这将等待10秒钟foo,然后将其杀死.

更新

仅在进程正在运行时终止进程.

# If thread is active
if p.is_alive():
    print "foo is running... let's kill it..."

    # Terminate foo
    p.terminate()
Run Code Online (Sandbox Code Playgroud)

更新2:推荐

使用jointimeout.如果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()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!理想情况下,如果进程尚未终止,我只想终止该进程。有没有办法检查这个? (2认同)
  • @Goldname这并不重要.这是我通常使用的安全构造.您不希望线程在导入时运行. (2认同)
  • 我们如何从 foo 返回值? (2认同)

LtW*_*orf 7

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) 
Run Code Online (Sandbox Code Playgroud)

超时不是很精确,但如果您不需要极高的精度,可以这样做。

另一种方法是使用资源模块,并设置最大 CPU 时间。

  • 提醒一下,信号只能在主线程中工作,所以对于使用多线程的人来说,使用信号模块可能不是一个好主意 (4认同)
  • 你能稍微扩展一下它以显示它如何终止函数“foo”而不是整个Python脚本吗?我希望我的脚本继续执行,只是为了让对 `foo` 的调用在 10 秒后超时。 (2认同)