如何在Python中在父进程和分叉子进程之间共享数据?

12 投票
5 回答
14555 浏览
提问于 2025-04-11 09:32

我觉得可以用 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()

撰写回答