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てから kill します。

アップデート

プロセスが実行中の場合にのみ、プロセスを終了します。

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

    # Terminate foo
    p.terminate()

更新 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()
于 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) 

タイムアウトはあまり正確ではありませんが、極端な精度が必要ない場合は可能です。

もう 1 つの方法は、リソースモジュールを使用して、最大 CPU 時間を設定することです。

于 2013-02-17T20:57:18.757 に答える