07-消息队列-基本操作
目标¶
- 能够说出queue的put() 和 get() 的作用
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。
1. Queue介绍¶
可以使用multiprocessing模块的Queue实现多进程之间的数据传递,
Queue本身是一个消息列队程序
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)
运行结果:
说明¶
初始化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);