6

多数の独立した計算が実行される複雑なデータ構造 (ユーザー定義型) があります。データ構造は基本的に不変です。インターフェイスは不変に見えますが、内部的に遅延評価が行われているためです。遅延計算された属性の一部は辞書に格納されます (入力パラメーターによるコストのかかる関数の戻り値)。これらの計算を並列化するために、Python のマルチプロセッシングモジュールを使用したいと思います。私の心には2つの質問があります。

  1. プロセス間でデータ構造を共有するにはどうすればよいですか?
  2. ロックを使用せずに遅延評価の問題を処理する方法はありますか (複数のプロセスが同じ値を書き込みます)。

回答、コメント、または啓発的な質問をお寄せいただきありがとうございます。

4

1 に答える 1

8

プロセス間でデータ構造を共有するにはどうすればよいですか?

パイプライン。

origin.py | process1.py | process2.py | process3.py

各計算が次の形式の個別のプロセスになるように、プログラムを分割します。

def transform1( piece ):
    Some transformation or calculation.

テストでは、このように使用できます。

def t1( iterable ):
    for piece in iterable:
        more_data = transform1( piece )
        yield NewNamedTuple( piece, more_data )

単一のプロセスで計算全体を再現するには、これを行うことができます。

for x in t1( t2( t3( the_whole_structure ) ) ):
    print( x )

わずかなファイル I/O で各変換をラップできます。これには Pickle がうまく機能しますが、他の表現 (JSON や YAML など) もうまく機能します。

while True:
    a_piece = pickle.load(sys.stdin)
    more_data = transform1( a_piece )
    pickle.dump( NewNamedTuple( piece, more_data ) )

各処理ステップは、独立した OS レベルのプロセスになります。これらは同時に実行され、すぐにすべての OS レベルのリソースを消費します。

ロックを使用せずに遅延評価の問題を処理する方法はありますか (複数のプロセスが同じ値を書き込みます)。

パイプライン。

于 2010-08-10T10:16:46.313 に答える