# 队列可以实现不同进程间的通信
"""关于队列
进程的队列和线程的队列并不是一个队列,他们的机制也是不一样的,实现的效果是类似的。
线程队列:from queue import Queue
进程队列:from multiprocessing import Process,Queue
队列默认为先进先出,先put进去的数据最先被get出来,
"""
from multiprocessing import Process, Queue
"""示例1、证明进程间的数据是不共享的
首先在主(父)进程中,定义了q = Queue()。
然后创建了3个子进程,调用函数Foo1(),
最后在执行命令时,发现报错“name 'q' is not defined”,说明在子进程中获取不到父进程数据“q = Queue()”
"""
def foo1():
q.put('测试')
if __name__ == '__main__':
q = Queue() # 子进程获取不到该主进程定义
p_list = []
for i in range(3):
p = Process(target=foo1)
p_list.append(p)
p.start()
print(q.get())
print(q.get())
print(q.get())
for i in p_list:
i.join()
"""示例2、进程间数据是不能共享的,但是进程间可以通过队列(Queue)通信,将队列做为参数传递给函数
1、由于子进程中无法获取主(父)进程的q = Queue(),我们在创建子进程时将q作为参数传递,让子进程获取队列q = Queue()
这样就可以通过一个队列(q)实现进程间的通信(因为主(父)进程和子进程使用内容一样的队列)
2、每个进程往队列q中put一条数据,然后在get取出
注:下面的弄不清楚的可以跳过,因为是python自动做的没有什么纠结的必要
1、为了说明主(父)进程和子进程中的队列q的关系,我们打印q的内存位置
2、结果证明,主(父)进程和三个子进程的q并不是同一个队列q,说明子进程的队列q是拷贝的并不是共用的同一个队列q。
3、但是在最后从队列q取值时,使用的全部都是主(父)进程的队列,说明队列q在put时数据是单独的,但是在get时都是一个队列。
说明进程的队列,会自动将不同进程的队列信息传入到一个统一的队列(主进程的),用于调用,实现进程通过的队列的通信。
"""
def foo2(q, n):
q.put(['子进程传入队列第{}数据'.format(n)]) # 在队列q中put数据,每个进程一次
print("子进程中队列q的内存位置:", id(q)) # 打印每个进程队列的内存地址
if __name__ == '__main__':
q = Queue()
p_list = []
q.put('主进程传入队列数据')
print("主(父)进程中队列q的内存位置:", id(q))
for i in range(1, 4): # 循环创建3个进程,并启动
p = Process(target=foo2, args=(q, i))
p_list.append(p)
p.start()
print(q.get()) # 逐条取出队列中的内容,并打印队列在内存中的地址(主进程一条,子进程3条)
print(id(q))
print(q.get())
print(id(q))
print(q.get())
print(id(q))
print(q.get())
for i in p_list:
i.join()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。