Pythonでの関数の実行を制限する

アンドリューファウント

同様の質問や回答がたくさんありますが、それでも信頼できる答えを見つけることができません。

だから、私はおそらく長すぎる可能性がある関数を持っています。コードを変更できないという意味で、関数はプライベートです。

実行時間を60秒に制限したい。私は次のアプローチを試しました:

  1. Pythonシグナル。Windowsおよびマルチスレッド環境(mod_wsgi)では機能しません。
  2. スレッド。いい方法ですが、スレッドを止めることができないので、上げても生きていますTimeoutException
  3. multiprocessingPythonモジュール。酸洗いに問題があり、解決方法がわかりません。time_limitデコレータを作成したいのですが、必要な関数をトップレベルにインポートするのに問題があります。長く実行される関数はインスタンスメソッドであり、それをラップすることも役に立ちません...

それで、上記の問題に対する良い解決策はありますか?私が始めたスレッドを殺す方法は?サブプロセスを使用して酸洗いの問題を回避する方法は?あるsubprocess任意のヘルプのモジュール?

ありがとうございました。

skrrgwasme

マルチプロセッシングアプローチがあなたの唯一の本当の選択肢だと思います。スレッドを(うまく)強制終了できず、シグナルにクロスプラットフォームの問題があるのは正しいです。マルチプロセッシングの実装は次のとおりです。

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]

編集
0

コメントを追加

0

関連記事

分類Dev

関数内での実行への復帰を制限する

分類Dev

Pythonで関数呼び出しの実行時間を制限する方法

分類Dev

SLURMで実行中のジョブの数を制限する

分類Dev

Pythonで関数の出力を制限する

分類Dev

ラムダ関数の並列実行制限を下げる?

分類Dev

待機DNS逆関数jsの実行時間を制限する

分類Dev

Pythonでスクリプトの強制終了時に関数を実行する

分類Dev

実行中の並行タスクの数を制限する

分類Dev

特定のdivでJS関数を強制的に実行する方法

分類Dev

pytestで実行するテストケースの数を制限する

分類Dev

実行中のgoルーチンの数を制限する

分類Dev

セロリで実行されるタスクの数を制限する方法

分類Dev

PowerShellで実行される開始プロセスの数を制限する

分類Dev

Pythonで数値的に無限の合計を実行する方法

分類Dev

Azure関数-並列実行の制限

分類Dev

Azure関数-並列実行の制限

分類Dev

NodejsでのQpromiseの同時実行を制限する

分類Dev

JavaScript関数で無制限の引数を使用する

分類Dev

Haskell-特定の関数の実行時間を制限する方法はありますか?

分類Dev

Pythonでtime.sleep()関数を1つのループに制限する

分類Dev

埋め込みPythonの実行時間を制限する

分類Dev

*特定の*アクティビティ関数の同時実行を制限できますか?

分類Dev

node.jsで非同期関数を実行するための時間制限を設定するにはどうすればよいですか?

分類Dev

Python:関数の実行を中断する

分類Dev

2回目の実行で関数の最初の実行を停止する(Python)

分類Dev

崇高なPythonの変数で関数を実行する方法

分類Dev

特定のdivでjquery関数を制限する

分類Dev

ラムダ関数の予約されていない同時実行を制限する

分類Dev

別々のCPUで異なるPython関数を実行する

Related 関連記事

  1. 1

    関数内での実行への復帰を制限する

  2. 2

    Pythonで関数呼び出しの実行時間を制限する方法

  3. 3

    SLURMで実行中のジョブの数を制限する

  4. 4

    Pythonで関数の出力を制限する

  5. 5

    ラムダ関数の並列実行制限を下げる?

  6. 6

    待機DNS逆関数jsの実行時間を制限する

  7. 7

    Pythonでスクリプトの強制終了時に関数を実行する

  8. 8

    実行中の並行タスクの数を制限する

  9. 9

    特定のdivでJS関数を強制的に実行する方法

  10. 10

    pytestで実行するテストケースの数を制限する

  11. 11

    実行中のgoルーチンの数を制限する

  12. 12

    セロリで実行されるタスクの数を制限する方法

  13. 13

    PowerShellで実行される開始プロセスの数を制限する

  14. 14

    Pythonで数値的に無限の合計を実行する方法

  15. 15

    Azure関数-並列実行の制限

  16. 16

    Azure関数-並列実行の制限

  17. 17

    NodejsでのQpromiseの同時実行を制限する

  18. 18

    JavaScript関数で無制限の引数を使用する

  19. 19

    Haskell-特定の関数の実行時間を制限する方法はありますか?

  20. 20

    Pythonでtime.sleep()関数を1つのループに制限する

  21. 21

    埋め込みPythonの実行時間を制限する

  22. 22

    *特定の*アクティビティ関数の同時実行を制限できますか?

  23. 23

    node.jsで非同期関数を実行するための時間制限を設定するにはどうすればよいですか?

  24. 24

    Python:関数の実行を中断する

  25. 25

    2回目の実行で関数の最初の実行を停止する(Python)

  26. 26

    崇高なPythonの変数で関数を実行する方法

  27. 27

    特定のdivでjquery関数を制限する

  28. 28

    ラムダ関数の予約されていない同時実行を制限する

  29. 29

    別々のCPUで異なるPython関数を実行する

ホットタグ

アーカイブ