Python で特定の関数 (重い関数) を実行したいのですが、X 秒以上実行したくありません。たとえば、foo() を実行したいのですが、20 秒経っても処理が終了しない場合は、プログラムを実行し続けたいと考えています。foo() の実行中にプログラムを実行し続けたくありません。foo() が終了するか、20 秒が経過した場合にのみ実行を継続したい (スレッドがここに収まらない)
助言がありますか?
Python で特定の関数 (重い関数) を実行したいのですが、X 秒以上実行したくありません。たとえば、foo() を実行したいのですが、20 秒経っても処理が終了しない場合は、プログラムを実行し続けたいと考えています。foo() の実行中にプログラムを実行し続けたくありません。foo() が終了するか、20 秒が経過した場合にのみ実行を継続したい (スレッドがここに収まらない)
助言がありますか?
「簡単な」方法は、関数内に初期化時間を保持し、適切な時間 (ループの開始、終了、データ書き込みの前後など) で現在の時間をそれに対してチェックすることです。もちろん、これは必ずしも 20 秒で停止するとは限りません。また、foo() が内部でハングしている場合は機能しません。
それ以外の場合は、おそらくこれを見ているでしょう: Python での非同期メソッド呼び出し?
メソッドがソケットを扱っている場合は、Python 標準ライブラリのasyncoreも役立つ可能性があります。
EDIT:より詳細に(http://docs.python.org/library/multiprocessing.html#multiprocessing.Processから):
import multiprocessing
#identity function, replace with your actual foo
def foo(x):
return x
if __name__ == '__main__':
foo_args = #some tuple containing non-kw arguments for your function
foo_kwargs = #some dict containing kw arguments for your function
proc = multiprocessing.Process(target=foo,args=foo_args,kwargs=foo_kwargs)
proc.start()
proc.join(20) #This takes a timeout argument in seconds
質問の仮定に反して、これにスレッドを使用することもできます。呼び出し時またはタイムアウトまで親スレッドをブロックするだけです (同じ join 呼び出しで、スレッド化とマルチプロセッシングのインターフェイスは同じです)。
関数の結果が戻り値として必要な場合は、同じページのパイプとキューがそれを返すことができます。