0

複数の計算を並行して開始し、最初の計算が戻ったときにすべてを停止するにはどうすればよいでしょうか?

私が念頭に置いているアプリケーションは次のとおりです。特定の値を計算する方法は複数あります。各メソッドの所要時間は、関数のパラメーターによって異なります。計算を並行して開始することにより、最速の計算が毎回自動的に「選択」され、他の計算は停止されます。

ここで、この質問をより難しくしている「詳細」がいくつかあります。

  • 計算される関数のパラメーターには関数が含まれます(データ ポイントから計算されます。それらは最上位のモジュール関数ではありません)。実際、計算は 2 つの関数の畳み込みです。そのような関数パラメーターをサブプロセスに渡す方法がわかりません (ピッキングできません)。
  • すべての計算コードにアクセスできるわけではありません: 一部の計算は Scipy によって内部的に行われます (おそらく Fortran または C コードを介して)。プロセスに送信できる終了シグナルに似たものをスレッドが提供するかどうかはわかりません。

これはPythonが比較的簡単にできることですか?

4

3 に答える 3

1

multiprocessingまだモジュールを見ていない場合は、モジュールを見ていきます。シンプルthreadingなインターフェイスを提供しながら、タスクを個別のプロセスにオフロードする方法を提供します。

モジュールで取得するのと同じ種類のプリミティブ (threadingタスク間でメッセージを渡すためのワーカー プールやキューなど) を提供しますが、実際にはタスクが個別のプロセスで実行されるため、GIL の問題を回避できます。

あなたが望むものの実際のセマンティクスは非常に具体的であるため、すぐに使用できる法案に適合するルーチンはないと思いますが、確実に1つをノックアップできます.

注: 関数を渡したい場合は、タスク間でデータを共有するための要件である pickleable ではないため、バインドされた関数にすることはできません。

于 2010-01-20T15:00:34.257 に答える
0

グローバル インタープリター ロックのため、この方法で高速化するのは難しいでしょう。実際には、Python のマルチスレッド プログラムでさえ、1 つのコアでしか実行できません。したがって、N プロセスを 1/N 倍の速度で実行することになります。1 つが他の半分の時間で終了したとしても、全体像としてはまだ時間を失うことになります。

于 2010-01-20T14:59:24.837 に答える
0

プロセスは簡単に開始および終了できます。

あなたはこれを行うことができます。

import subprocess
watch = []
for s in ( "process1.py", "process2.py", "process3.py" ):
    sp = subprocess.Popen( s )
    watch.append( sp )

今は、それらの 1 つが終了するのを待っているだけです。1つが終わったら、他の人を殺します。

import time
winner= None
while winner is None:
    time.sleep(10)
    for w in watch:
        if w.poll() is not None:
            winner= w
            break
for w in watch:
    if w.poll() is None: w.kill()

これらはプロセスであり、スレッドではありません。GIL に関する考慮事項はありません。オペレーティング システムにそれらをスケジュールさせます。それが最も得意とすることです。

さらに、各プロセスは、代替アルゴリズムの 1 つを使用して問題を単純に解決する単なるスクリプトです。それらは完全に独立しており、スタンドアロンです。設計、構築、およびテストが簡単です。

于 2010-01-20T15:26:29.893 に答える