1.Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信.

可以使用multiprocessing模块的Queue实现多进程之间的数据传递,

Queue本身是一个消息列队程序:

  1. from multiprocessing import Queue
  2. q=Queue(3) # 初始化一个Queue对象,最多可接收三条put消息
  3. q.put("消息1")
  4. q.put("消息2")
  5. print(q.full()) # False
  6. q.put("消息3")
  7. print(q.full()) # True
  8. # 因为消息列队已满下面的try都会抛出异常,
  9. # 第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异
  10. try:
  11. q.put("消息4",True,2)
  12. except:
  13. print("消息列队已满,现有消息数量:%s"%q.qsize())
  14.  
  15. try:
  16. q.put_nowait("消息4")
  17. except:
  18. print("消息列队已满,现有消息数量:%s"%q.qsize())
  19. # 推荐的方式,先判断消息列队是否已满,再写入
  20. if not q.full():
  21. q.put_nowait("消息4")
  22. # 读取消息时,先判断消息列队是否为空,再读取
  23. if not q.empty():
  24. for i in range(q.qsize()):
  25. print(q.get_nowait())

2.初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,

那么就代表可接受的消息数量没有上限(直到内存的尽头);

Queue.qsize():返回当前队列包含的消息数量;

Queue.empty():如果队列为空,返回True,反之False;

Queue.full():如果队列满了,返回True,反之False;

Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;

  1. a.如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,
  2. 此时程序将被阻塞,停在读取状态,直到从消息列队读到消息为止,如果设置了timeout,
  3. 则会等待timeout秒,若还没读取到任何消息,则抛出”Queue.Empty”异常;
  4. b.如果block值为False,消息列队如果为空,则会立刻抛出”Queue.Empty”异常;
  5. Queue.get_nowait()--相当Queue.get(False);
  6. 如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,
  7. 此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,
  8. 如果设置了timeout,则会等待timeout秒,若还没空间,则抛出”Queue.Full”异常;
  9. 如果block值为False,消息列队如果没有空间可写入,则会立刻抛出”Queue.Full”异常;
  10. Queue.put_nowait(item)--相当Queue.put(item, False);

3.在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

  1. from multiprocessing import Process, Queue
  2. import os, time, random
  3. # 写数据进程执行的代码:
  4. def write(q):
  5. for value in ['A', 'B', 'C']:
  6. print('Put %s to queue...' % value)
  7. q.put(value)
  8. time.sleep(random.random())
  9. # 读数据进程执行的代码:
  10. def read(q):
  11. while True:
  12. if not q.empty():
  13. value = q.get(True)
  14. print('Get %s from queue.' % value)
  15. time.sleep(random.random())
  16. else:
  17. break
  18.  
  19. if __name__=='__main__':
  20. # 父进程创建Queue,并传给各个子进程:
  21. q = Queue()
  22. pw = Process(target=write, args=(q,))
  23. pr = Process(target=read, args=(q,))
  24. # 启动子进程pw,写入
  25. pw.start()
  26. # 等待pw结束:
  27. pw.join()
  28. # 启动子进程pr,读取:
  29. pr.start()
  30. pr.join()
  31. # pr进程里是死循环,无法等待其结束,只能强行终止:
  32. print('')
  33. print('所有数据都写入并且读完')

4.进程池中的Queue

  1. 如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),
  2. 而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:
  3. RuntimeError: Queue objects should only be shared between processes through inheritance.

5.下面的实例演示了进程池中的进程如何通信:

  1. # 修改import中的Queue为Manager
  2. from multiprocessing import Manager,Pool
  3. import os,time,random
  4.  
  5. def reader(q):
  6. print("reader启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
  7. for i in range(q.qsize()):
  8. print("reader从Queue获取到消息:%s"%q.get(True))
  9.  
  10. def writer(q):
  11. print("writer启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
  12. for i in "dongGe":
  13. q.put(i)
  14.  
  15. if __name__=="__main__":
  16. print("(%s) start"%os.getpid())
  17. q=Manager().Queue() #使用Manager中的Queue来初始化
  18. po=Pool()
  19. #使用阻塞模式创建进程,这样就不需要在reader中使用死循环了,可以让writer完全执行完成后,再用reader去读取
  20. po.apply(writer,(q,))
  21. po.apply(reader,(q,))
  22. po.close()
  23. po.join()
  24. print("(%s) End"%os.getpid())

参考博客:https://blog.csdn.net/Duke10/article/details/79867656

python使用Queue进行进程间通信的更多相关文章

  1. Python中Queue模块及多线程使用

    Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...

  2. Python队列queue模块

    Python中queue模块常用来处理队列相关问题 队列常用于生产者消费者模型,主要功能为提高效率和程序解耦 1. queue模块的基本使用和相关说明 # -*- coding:utf-8 -*- # ...

  3. Python开发基础-Day32 进程间通信、进程池、协程

    进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程 ...

  4. python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  5. Python之Queue模块

    Queue 1.创建一个“队列”对象 >>> import Queue >>> queue = Queue.Queue(maxsize=100) >>& ...

  6. 后台程序处理(二) python threading - queue 模块使用

    由于协程没办法完成(一)中所说的任务模式 接下来就尝试一下使用线程和队列来实现一下这个功能 在实现之前,我们先明确一个问题--python的线程是伪并发的.同一时间只能有一个线程在运行.具体怎样的运作 ...

  7. python之Queue

    一.多进程的消息队列 “消息队列”是在消息的传输过程中保存消息的容器 消息队列最经典的用法就是消费者和生成者之间通过消息管道来传递消息,消费者和生成者是不通的进程.生产者往管道中写消息,消费者从管道中 ...

  8. python socket非阻塞及python队列Queue

    一. python非阻塞编程的settimeout与setblocking+select 原文:www.th7.cn/Program/Python/201406/214922.shtml 侧面认证Py ...

  9. Python|队列Queue

    一 前言 本文算是一次队列的学习笔记,Queue 模块实现了三种类型的队列,它们的区别仅仅是队列中元素被取回的顺序.在 FIFO 队列中,先添加的任务先取回.在 LIFO 队列中,最近被添加的元素先取 ...

随机推荐

  1. phpstudy2016+phpstorm2017-3+xdebug+chrome

    1. 勾选Xdebug 后 phpstudy 会自动重启服务 [XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" ...

  2. python3.6:DLL load failed:找不到指定的模块(from PyQt5 import QtCore)

    本人小白搭建pyqt环境时遇到问题 运行代码 from PyQt5 import QtCore' 发现错误 ImportError: DLL load failed: 找不到指定的模块 这个问题折磨了 ...

  3. 10个MCU常用的基础知识

    转自:http://bbs.21ic.com/icview-2659278-1-1.html 1.MCU有串口外设的话,在加上电平转换芯片,如MAX232.SP3485就是RS232和RS485接口了 ...

  4. POJ:1094-Sorting It All Out(拓扑排序经典题型)

    Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ...

  5. Linux学习-X Server 配置文件解析与设定

    X server 的配置 文件都是预设放置在 /etc/X11 目录下,而相关的显示模块或上面提到的总总模块,则主要放置在/usr/lib64/xorg/modules . 比较重要的是字型文件与芯片 ...

  6. hdu4489 组合公式+dp

    这里对于题意在说明一下, 题目中要求的排列必须是波浪形,每一个在排列中的人不是波峰就是波谷,如果它既不是波峰也不是波谷排列就是错的. 对于我这种数学渣渣来说,做一道dp题要好久,%>_<% ...

  7. 使用css Flexbox实现垂直居中

    CSS布局对我们来说一直是个噩梦,我们都认为flexbox是我们的救世主.是否真的如我们说说,还有待观察,但是flexbox确非常轻松的解决css长久一来比较难解决的居中问题.让我们来看看到底有多容易 ...

  8. 了解CSS核心精髓(一)

    CSS 1.css外联 正确写法:<link rel="stylesheet" href="css/style.css" /> <style ...

  9. hibernate源码分析1-保存一个对象

    要点 用了event的方式贯穿CRUD的过程 值得学习 用dynamic-insert 支持 插入时 可选 全字段插入 还是仅仅有值的字段插入. 返回主键的值 用了 Serializable 类型作为 ...

  10. Matplotlib中文乱码解决办法

    Matplotlib中文乱码 解决方法如下: 首先设置源码文件编码方式为UTF-8 #-*- coding: utf-8 -*- 接着设置字体属性字典 font = {'family': 'SimHe ...