web-dev-qa-db-ja.com

効率的Python to Python IPC

次の要件を持つ プロセス間通信(IPC) framework\techniqueとは何ですか?

  • ネイティブPythonオブジェクトを2つのPythonプロセス間で転送する
  • 時間とCPUで効率的(RAM効率は無関係)
  • クロスプラットフォームのWin\Linux
  • ありがたい: PyPy

UPDATE 1:プロセスは同じホスト上にあり、同じバージョンのPythonと他のモジュールを使用します

UPDATE 2:プロセスはユーザーによって独立して実行され、どのプロセスも他のプロセスを生成しません

26
Jonathan

ネイティブオブジェクトは、プロセス間で共有されません(参照カウントのため)。

代わりに、それらをpickle化して、UNIXドメインソケット、mmap、zeromq、または同時アクセス用に設計されたsqlite3などの仲介者を使用して共有できます。

18

最初に multiprocessing を使用します。

複数のCPUが必要な場合は、 celery を参照してください。

8
S.Lott

execnetPyro の両方でPyPy <-> CPython通信について言及しています。 Python Wikiの Parallel Processing ページからの他のパッケージもおそらく適しています。

6
TryPyPy

Parallel Python は一見の価値があるかもしれませんが、Windows、OS X、およびLinuxで動作します(かつてUltraSPARC Solaris 10マシンで使用したことを思い出しているようです)。 PyPyで動作するかどうかはわかりませんが、 Psycoで動作するようです です。

5
ChrisC

いくつかのテストの後、以下のアプローチがmmapを使用するLinuxで機能することがわかりました。

Linuxには/dev/shmがあります。 POSIX shm_openを使用して共有メモリを作成すると、このフォルダに新しいファイルが作成されます。

Pythonのmmapモジュールはshm_open関数を提供していませんが。通常のopenを使用して/dev/shmにファイルを作成できますが、実際には類似しており、メモリに常駐しています。 (os.unlinkを使用して削除してください)

次に、IPCの場合、mmapを使用して、そのファイルをさまざまなプロセスの仮想メモリ空​​間にマップできます。すべてのプロセスがそのメモリを共有します。 Pythonは、メモリをバッファとして使用し、その上にバイトやnumpy配列などのオブジェクトを作成できます。または、ctypesインターフェースを介して使用できます。

もちろん、競合状態を回避するためにプロセス同期プリミティブが必要です。

mmap docctypes doc およびnumpy.loadオプションがある mmap_mode を参照してください。

5
Liu Sha