Python3.x:多进程Queue

各个进程的内存都是独立的,不能互相直接访问,那我们如何进行进程间通信呢?其实之前有提到过,就是通过一个中间人,来实现两个进程之间的通信,下面来看看都有哪些方式能够实现进程间通信

进程queue

说进程queue之前,先说一下线程queue与进程的关系,因为这里有个事情要注意一下,首先看一段代码

from multiprocessing import Process
import queue
# import os


def f():
    q.put([3, None, 'dasda'])
    print(q.get())


if __name__ == '__main__':
    q = queue.Queue()
    p = Process(target=f,)
    p.start()
    print(q.get(block=False))

可以看到这里用的队列queue,主进程生成一个空队列实例,然后再主进程再开一个进程,在子进程里对队列q进行操作,这段代码在不同的环境中运行结果不同,在windows下当程序运行到f函数里的q.put([3, None, 'dasda'])的时候就会抛出错误:q没有定义,这里也好理解,就是子进程无法访问主进程的一些数据,但是在mac、ubuntu或者win下的anaconda下运行的时候子进程可以对q进程put和get操作,然后程序会在最后一行get的时候抛出队列为空的错误,这里我的理解方式就是子进程数据拷贝自父进程,也就是子进程存在一个定义了的q,但是进程间数据又不共享,所以主进程里的q还是为空

让我们来看看这两种情况


子进程存在定义了的q队列

子进程不存在定义了的q队列

这个时候就用到了进程queue,使用进程queue来实现进程间的通信

from multiprocessing import Queue
from multiprocessing import Process


def run():
    q.put(3)
    # print(q.get())


if __name__ == '__main__':
    q = Queue()
    t = Process(target=run)
    t.start()
    # time.sleep(1)
    print(q.get())

这里可能会问,既然进程也有queue,那是不是这个queue能实现和线程queue一样的效果呢?答案是no,线程queue实现的是操作同一份数据,但是进程queue实现的是数据的复制,通过复制一个queue来实现进程间通信

转载请注明出处

python自学技术互助扣扣群:670402334

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • @(python)[笔记] 目录 一、什么是进程 1.1 进程的概念 进程的概念起源于操作系统,是操作系统最核心的...
    CaiGuangyin阅读 1,272评论 0 9
  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 1,777评论 0 17
  • 幸福是一个温暖的拥抱,幸福是家人团聚……幸福就在眼前。 以前的我不知道什么是幸福,自从那件事以后…...
    徐紫瑜阅读 278评论 1 3
  • 为了增强对企业业务过程的有效管理,需要在 MES系统软件 中引入工作流技术。在MES系统软件中,对业务性很强的...
    dw456阅读 1,141评论 0 0
  • 时间一秒一秒的转动,到了八点半,我打了声招呼开始出门,今天对我来讲是一个特殊的日子,我第一次准备外出找工作,如果家...
    老狼哥哥阅读 155评论 0 0