Pythonで一定時間後に(まだ実行中の)関数を強制終了する最も良い方法はありますか?これが私たちの基本機能であると言う与えられた時間が経過した後に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')
これらの2つの方法の範囲、安全性、使いやすさの面でのメリットとデメリットは何ですか?より良いアプローチはありますか?
キャッチオン信号アプローチに感謝します。私は並列処理とシンプルさのためにマルチプロセッシングの使用を計画していると思います。 – Anna
マルチプロセッシングでは、try/exceptを使用してp.terminate()をカプセル化してください。アプリケーションが頻繁に使用されると、p.join()のタイムアウトがpのままで、p.is_alive()がtrueを返し、pが直後に終了し、p.terminate()を呼び出すと、 pがもう動いていないので例外が発生します。あなたのアプリケーションの状態があなたが望むもの(実行中ではない)であるので、例外を簡単に無視することができますが、キャッチされなければメインプログラムはこの時点で終了します。 – Hannu
実際には、is_alive()チェックは、is_aliveと次のコマンドの間でpが死ぬ可能性があるため、追加の有用な情報を提供しないので、まったく必要ありません。 try/exceptの中でp.terminate()を呼び出し、例外を無視するだけです。それは成功するか失敗するかにかかわらず、あなたのpは消えます。 – Hannu