07-消息队列-常见判断

目标

  • 能够说出queue的full() 和 empty() 的作用
  • 能够使用qsize() 获取队列中消息的个数

1. 消息数量、判断是否为空、判断是否已满

  • 消息数量 qsize(),注意队列每get() 一次,数量就会 - 1
# 导入模块
import multiprocessing

queue = multiprocessing.Queue(3)
# queue.put(值) 向消息队列中放入内容
# put的值几乎可以是任意类型
queue.put(1)             # 放入第一个值
queue.put("hello")       # 放入第二个值
queue.put([1, 2, 3])     # 放入第三个值

# 获取第一个值
print("取值前消息数量:", queue.qsize())
value1 = queue.get()
print(value1)
print("取值后消息数量:", queue.qsize())

image-20180703212518413

  • empty() 判断队列是否为空
# 导入模块
import multiprocessing

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

# 此处通过queue.empty() 获取队列是否已空,得到结果为True 看似队列已经空了
# 造成此种结果的原因是:获取是否为空的进程和放置值的进程同时执行,值未放进去,empty() 已经开始取值了...
result = queue.empty()
print(result)

image-20180703213325499

​ 解决办法:time.sleep(0.0001) 稍微休眠下

  • full() 判断队列是否已满(消息数量达到设定上限,则为满)
# 导入模块
import multiprocessing

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

result = queue.full()    # False 表示未满
print(result)

queue.put([1, 2, 3])     # 放入第三个值

result = queue.full()    # True 表示已满
print(result)

image-20180703213641178

2.注意

  • 队列已满,则无法放入值

image-20180703215322431

queue.put_nowait()

image-20180703215458794

  • 队列已空,则无法获取值

image-20180703215836059