基本的にオブジェクトの遅延メソッド呼び出しで構成される単純なデータ フロー フレームワークをプログラムする予定です。分散プログラミングを検討する場合、Python でそれを有効にする最も簡単な方法は何ですか? 私がネットワークプログラミングをしなくても、透過的なソリューションはありますか?
または、まず、Python でマルチコア プロセッサを利用するにはどうすればよいでしょうか?
基本的にオブジェクトの遅延メソッド呼び出しで構成される単純なデータ フロー フレームワークをプログラムする予定です。分散プログラミングを検討する場合、Python でそれを有効にする最も簡単な方法は何ですか? 私がネットワークプログラミングをしなくても、透過的なソリューションはありますか?
または、まず、Python でマルチコア プロセッサを利用するにはどうすればよいでしょうか?
オブジェクトの遅延メソッド呼び出し
実際には何でもかまいませんので、分解してみましょう。
幸運を祈ります!python には、リモート プロシージャ コールの最大の実装の 1 つである RPyCがあります。
サーバーを実行するだけです (ファイルをダブルクリックします。チュートリアルを参照してください)。
インタープリターを開き、次のことを行います。
import rpyc
conn = rpyc.classic.connect("localhost")
data_obj = conn.modules.lazyme.AwesomeObject("ABCDE")
print(data_obj.calculate(10))
そして怠惰なバージョン (非同期):
# wrap the remote function with async(), which turns the invocation asynchronous
acalc = rpyc.async(data_obj.calculate)
res = acalc(10)
print(res.ready, res.value)
複雑な画像操作など、定義された作業単位があります。あなたがすることは、大まかに言えばNode
、実際の作業を行う作成者 (別名、画像を取得し、操作を行い、結果を返す)、結果を収集する人 (a Sink
)、および作業を作成する人 ( Distributor
) です。
セロリを見てください。
スケールが非常に小さい場合、または単に遊んでみたい場合は、パッケージPool
内のオブジェクトを参照してください。multiprocessing
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
print(p.map(f, [1,2,3]))
そして、本当に怠惰なバージョン:
print(p.map_async(f, [1,2,3]))
結果を検査できる Result オブジェクトを返します。
複雑なデータ操作、またはマルチステップ処理のユースケース。
このような場合、ZeroMQやRabbitMQなどのメッセージ ブローカを使用する必要があります。複数のサーバー間で「メッセージ」を簡単に送信できます。
これらは TCP ランドの恐怖からあなたを救いますが、もう少し複雑です (RabbitMQ のように、ブローカー用に別のプロセス/サーバーを必要とするものもあります)。ただし、データ フローをよりきめ細かく制御できるため、真にスケーラブルなアプリケーションを構築するのに役立ちます。
それ自体はデータ分散ではありませんが、Web サーバーのバックエンドで最もホットな傾向です。アプリケーション コードがビジー状態である間に、「グリーン」スレッド (またはイベント、またはコルーチン) を使用して IO の重いタスクを専用スレッドに委任します。 CPUを取り出します。
Gearman を試すhttp://gearman.org/
Gearman は、作業を実行するのにより適した他のマシンまたはプロセスに作業を委託するための汎用アプリケーション フレームワークを提供します。並行して作業を行い、処理の負荷を分散し、言語間で関数を呼び出すことができます。高可用性 Web サイトからデータベース複製イベントのトランスポートまで、さまざまなアプリケーションで使用できます。つまり、分散処理が通信する神経系です。
スターターとしてpython.orgの公式リソースをお読みください。
検討する可能性のある別のフレームワークは、Versile Python (完全開示: 私は VPy 開発者です) です。ドキュメンテーションレシピには、関連するコード例があります。このフレームワークを使用すると、サービスのセットアップと接続が簡単で、明示的なパブリック メソッド インターフェイスをクラスに定義するか、ネイティブの Python型フレームワークを使用してローカル メソッドにリモート アクセスできます。
複数のコアを利用するには、プログラムを複数のプロセスで実行するように設定する必要があることに注意してください (python グローバル インタープリター ロックのため)。