一个multiprocessing.Queue在创建它的进程(我们称之为“父进程”)和由父进程创建的进程(称之为“子进程”)之间共享。在
以下是一些不具有此关系的进程的示例:$ python myprogram.py &
$ python myprogram.py &
shell是这两个孩子的父对象。但是,shell没有创建multiprocessing.Queue,因此它不会被两个子对象共享。相反,他们将各自创建自己的。这可能与他们的子女分享,但不能彼此分享。在
您可以很容易地观察到这种行为:
^{pr2}$
第二个进程从不从队列中读取任何内容。但是,如果给这两个进程提供父子关系。。。在$ cat queuedemo.py
from os import getpid
from multiprocessing import Queue
from multiprocessing.process import Process
q = Queue()
q.put(getpid())
def child():
print(getpid(), q.get())
p = Process(target=child)
p.start()
p.join()
exarkun@baryon:/tmp/queue$ python queuedemo.py
(28469, 28467)
exarkun@baryon:/tmp/queue$
请注意,q.get()调用成功,并且放入队列中的pid与获取队列的进程的pid不同。在
在某种程度上,这也扩展到具有父-子代和兄弟关系的进程。在
所以:全局变量仅在单个进程中共享
多处理模块提供了一些工具来在相互正确关联的进程之间共享状态。在
如果你想在没有这种关系的进程之间共享状态,还有很多其他的选择——最好的一个将更多地取决于你必须共享什么样的状态以及你的共享模式是什么样的(你的问题中都没有包含这两个选项)。在