15

Python プロセス間でメモリを共有する方法を見つけようとしています。基本的に、複数の python プロセスが READ (読み取りのみ) および使用 (ミューテーションなし) できる必要があるオブジェクトが存在します。現在はredis+文字列+cPickleで実装しているが、cPickleは貴重なCPU時間を奪うので使わなくて済むようにしたい。私がインターネットで見た Python 共有メモリの実装のほとんどは、基本的に私が既に行っていることであり、まさに私が回避しようとしているファイルとピクルを必要とするようです。

私が疑問に思っているのは、基本的にメモリ内のpythonオブジェクトデータベース/サーバーと、データベースとのインターフェースに対応するCモジュールのようなものを書く方法があるかどうかということです?

基本的に、Cモジュールはサーバーにオブジェクトを書き込むアドレスを要求し、サーバーはアドレスで応答し、モジュールはオブジェクトを書き込み、指定されたキーを持つオブジェクトがディスクに書き込まれたことをサーバーに通知します指定された場所。次に、プロセスのいずれかが特定のキーでオブジェクトを取得したい場合、特定のキーのメモリの場所をデータベースに要求するだけで、サーバーはその場所で応答し、モジュールはそのスペースをメモリにロードする方法を認識し、 python オブジェクトを python プロセスに戻します。

それは完全に不合理ですか、それとも実装するのが本当に難しいですか? 私は不可能なことを追いかけていますか?どんな提案でも大歓迎です。ありがとうインターネット。

4

4 に答える 4

5

不合理ではありません。

IPC はメモリ マップド ファイルで実行できます。Python には機能が組み込まれています。

http://docs.python.org/library/mmap.html

両方のプロセスでファイルを mmap するだけで、共有ファイルを作成できます。もちろん、変更内容を確認するには、両方のプロセスでポーリングする必要があります。そして、両方の間で書き込みを協力する必要があります。そして、データをどの形式にするかを決定します。しかし、これは問題に対する一般的な解決策です。

于 2012-07-02T23:45:05.423 に答える
3

ピクルスをしたくない場合は、multiprocessing.sharedctypes合うかもしれません。ただし、これは少し低レベルです。指定した型の単一の値または配列を取得します。

子プロセスにデータを配布する別の方法 (一方向) は、multiprocessing.Pipeです。これは Python オブジェクトを処理でき、C で実装されているため、ピクリングを使用しているかどうかはわかりません。

于 2012-07-03T05:51:57.763 に答える