同様の質問や回答がたくさんありますが、それでも信頼できる答えを見つけることができません。
だから、私はおそらく長すぎる可能性がある関数を持っています。コードを変更できないという意味で、関数はプライベートです。
実行時間を60秒に制限したい。私は次のアプローチを試しました:
TimeoutException
。multiprocessing
Pythonモジュール。酸洗いに問題があり、解決方法がわかりません。time_limitデコレータを作成したいのですが、必要な関数をトップレベルにインポートするのに問題があります。長く実行される関数はインスタンスメソッドであり、それをラップすることも役に立ちません...それで、上記の問題に対する良い解決策はありますか?私が始めたスレッドを殺す方法は?サブプロセスを使用して酸洗いの問題を回避する方法は?あるsubprocess
任意のヘルプのモジュール?
ありがとうございました。
マルチプロセッシングアプローチがあなたの唯一の本当の選択肢だと思います。スレッドを(うまく)強制終了できず、シグナルにクロスプラットフォームの問題があるのは正しいです。マルチプロセッシングの実装は次のとおりです。
import multiprocessing
import Queue
def timed_function(return_queue):
do_other_stuff()
return_queue.put(True)
return
def main():
return_queue = multiprocessing.Manager().Queue()
proc = multiprocessing.Process(target=timed_function, args=(return_queue,))
proc.start()
try:
# wait for 60 seconds for the function to return a value
return_queue.get(timeout=60)
except Queue.Empty:
# timeout expired
proc.terminate() # kill the subprocess
# other cleanup
酸洗いの問題があるとおっしゃっていましたが、ほとんどの場合、リファクタリングで解決できます。たとえば、long関数はインスタンスメソッドであると言いました。あなたはできるマルチプロセッシングでそれらを使用するための機能のそれらの種類をラップ:
class TestClass(object):
def timed_method(self, return_queue):
do_other_stuff()
return_queue.put(True)
return
ワーカーのプールでそのメソッドを使用するには、このラッパーをモジュールのトップレベルに追加します。
def _timed_method_wrapper(TestClass_object, return_queue):
return TestClass_object(return_queue)
これで、たとえば、apply_async
同じクラスの別のメソッドからこのクラスメソッドを使用できます。
def run_timed_method():
return_queue = multiprocessing.Manager().Queue()
pool = multiprocessing.Pool()
result = pool.apply_async(_timed_method_wrapper, args=(self, return_queue))
これらのラッパーは、multiprocessing.Processオブジェクトでサブプロセスを起動する代わりにmultiprocessing.Poolを使用している場合にのみ必要であると確信しています。また、クラスが提供するすてきでクリーンな抽象化を破り、クラスとこの他のランダムなラッパー関数との間に依存関係を作成しているため、多くの人がこの構造に眉をひそめるでしょう。コードをもっと醜くする価値があるかどうかを判断するのはあなたでなければなりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加