前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十、python学习笔记-进程-进程通信之Queue

十、python学习笔记-进程-进程通信之Queue

原创
作者头像
堕落飞鸟
发布2022-02-08 21:58:35
2520
发布2022-02-08 21:58:35
举报
文章被收录于专栏:飞鸟的专栏
代码语言:javascript
复制
# 队列可以实现不同进程间的通信
"""关于队列
进程的队列和线程的队列并不是一个队列,他们的机制也是不一样的,实现的效果是类似的。
线程队列: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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档