import multiprocessing
import time
if __name__ == '__main__':
# 创建消息队列
# 3: 表示消息队列最大个数
queue = multiprocessing.Queue(3)
# 放入数据
queue.put(1)
queue.put("abc")
queue.put(["abc", "456"])
# 队列满了在放入数据, 就不能放入数据了,直到消息队列有空闲位置才能再放入数据
# queue.put(("34", 90))
# put_nowait: 不会等待队列有空闲位置再放入数据,如果数据放入不成功就直接崩溃
# queue.put_nowait(("34", 90))
# 建议: 放入数据使用put,因为比较安全不会崩溃
# 查看队列是否是满的
# result = queue.full()
# print(result)
# 坑点: 只使用put放入数据直接判断队列是否为空获取的结果不正确,因为没有等队列把数据写完直接就取获取了,那么这是队列是空的
# for i in range(10000):
# print(i)
# 解决办法: 1. 延时一段时间 2. 通过个数去判断
# time.sleep(0.001)
#
if queue.qsize() == 0: # mac 版本不能使用qsize()
print("队列是空的")
# result = queue.empty()
# print(result)
# 查看队列的个数
size = queue.qsize()
print("消息队列个数:", size)
# 获取队列的数据
value = queue.get()
print(value)
size = queue.qsize()
print("消息队列个数:", size)
# 获取队列的数据
value = queue.get()
print(value)
size = queue.qsize()
print("消息队列个数:", size)
# 获取队列的数据
value = queue.get()
print(value)
size = queue.qsize()
print("消息队列个数:", size)
# 队列为空, 使用get会等待,直到队列有数据以后再取值
# value = queue.get()
# print(value)
# 队列为空,取值的时候不等待,但是取不到值那么直接崩溃了
# value = queue.get_nowait()
# print(value)
# 建议: 获取队列的数据统一get,因为能保证代码不会有问题
try:
value = queue.get(timeout = 1)
finally:
print(value)
size = queue.qsize()
print("消息队列个数:", size)
print("结束!")
当队列为空时,再调用get函数,程序会阻塞,导致无法正常执行后面的代码,程序也不会退出,可以用get_nowait函数,当队列为空,不会等待,直接抛出异常,若想输出后面的内容,可以用try…finally…捕获异常执行。附:(timeout = 1可作为函数的参数)