如何在Python中在父进程和分叉子进程之间共享数据?
我觉得可以用 os.plock(op) 这个函数来实现这个功能,但我不知道具体怎么做。如果有更好的方法,我也很想知道。欢迎分享代码片段。
5 个回答
5
这基本上和Python没有关系!这是一个经典的Unix进程间通信的例子。一个不错的选择是使用popen()
来在父进程和子进程之间打开一个管道,这样就可以通过这个管道来传递数据或消息。
你可以看看subprocess
模块,它可以在创建子进程时自动设置好所需的管道。
8
看看这个在 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()
14
Subprocess 是用来替代 os.popen、os.system、os.spawn、popen2 和 commands 的工具。举个简单的例子,关于如何使用管道的:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
你还可以使用一个 内存映射文件,并设置标志为 MAP_SHARED,这样可以在不同的进程之间共享内存。
multiprocessing 则把 管道 和 共享内存 进行了抽象,提供了一个更高级的接口。以下内容摘自处理文档:
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()