Python で親プロセスとフォークされた子プロセスの間でデータを共有するにはどうすればよいですか?
質問
os.plock(op) 関数を使用してこれを行うことは間違いありませんが、その方法はわかりません。また、もっと良い方法があれば、教えていただけると幸いです。コードスニペットは大歓迎です。
解決
サブプロセス os.popen、os.system、os.spawn、popen2 およびコマンドを置き換えます。あ 配管の簡単な例 だろう:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
を使用することもできます メモリマップされたファイル プロセス間の共有メモリにはフラグ=MAP_SHAREDを使用します。
マルチプロセッシング 両方を要約します パイプ そして 共有メモリ より高いレベルのインターフェースを提供します。処理ドキュメントからの抜粋:
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()
他のヒント
Python 2.6で新しく追加された multiprocessing モジュールをご覧ください以前のバージョンでは、 pyprocessing
たとえば、パイプを使用した情報の受け渡しを示すドキュメントの例は次のとおりです。
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()
これはほとんどPythonに依存しません! Unixプロセス間通信の典型的な例です。 1つの良いオプションは、 popen()
を使用して親プロセスと子プロセスの間のパイプを開き、パイプに沿ってデータ/メッセージをやり取りすることです。
サブプロセス
モジュール。子プロセスの生成中に必要なパイプを自動的にセットアップできます。
2つのオプションがあります: os
モジュールの os.popen *
、または subprocess
モジュールを使用して同じ効果を得ることができます。 Pythonマニュアルには、のきれいなドキュメントと例があります。 popen およびサブプロセス。
低レベルのオペレーティングシステムフォークを実行していて、パイプの使用を避けたい場合は、共有メモリマップファイルも使用できます。これは、 subprocess
または popen
パイプを使用するのとほとんど同じではありませんが、完全性の答えを含めて...
完全な例がありますここですが、基本的には os ファイル処理と mmap モジュール:
import mmap, os, tempfile
fd, tmpfile = tempfile.mkstemp()
os.write(fd, '\x00' * mmap.PAGESIZE)
os.lseek(fd, 0, os.SEEK_SET)
child_pid = os.fork()
if child_pid:
buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_READ)
os.waitpid(child_pid, 0)
child_message = buf.readline()
print(child_message)
os.close(fd)
else:
buf = mmap.mmap(fd, mmap.PAGESIZE, mmap.MAP_SHARED, mmap.PROT_WRITE)
buf.write('testing\n')
os.close(fd)