55

我想打电话foo(n)但如果它运行超过 10 秒就停止它。有什么好方法可以做到这一点?

我可以看到,理论上我可以修改foo自己以定期检查它已经运行了多长时间,但我不希望这样做。

4

2 回答 2

66

干得好:

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()
于 2013-02-17T12:01:24.813 回答
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) 

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

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

于 2013-02-17T20:57:18.757 回答