07-消息队列-基本操作

目标

  • 能够说出queue的put() 和 get() 的作用

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

1. Queue介绍

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

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

image-20180615233602270

image-20180615233917675

queue-2261565

2. Queue基本使用

2.1 创建队列并且放入值

首先用一个小实例来演示一下Queue的工作原理:

# 导入模块
import multiprocessing

# 定义消息队列
# 如果不指定队列长度,则默认为最大,如果指定了消息队列的大小,则消息队列就有上限控制
# 此处的 Queue(3) 指的是放入3条消息
queue = multiprocessing.Queue(3)
# queue.put(值) 向消息队列中放入内容
# put的值几乎可以是任意类型
queue.put(1)             # 放入第一个值
queue.put("hello")       # 放入第二个值
queue.put([1, 2, 3])     # 放入第三个值
# 打印队列对象
print(queue)

# 获取第一个值
value1 = queue.get()
print(value1)

# 获取第二个值
value2 = queue.get()
print(value2)

# 获取第三个值
value3 = queue.get()
print(value3)

运行结果:

image-20180703211806037

说明

初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);

  • Queue.qsize():返回当前队列包含的消息数量;
  • Queue.empty():如果队列为空,返回True,反之False ;
  • Queue.full():如果队列满了,返回True,反之False;
  • Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;

  • 如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;

  • 如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常;
  • Queue.get_nowait():相当Queue.get(False);
  • Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;
  • 如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;
  • 如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;
  • Queue.put_nowait(item):相当Queue.put(item, False);