1.队列
队列为一种先进先出(FIFO)的结构,如下所示,显然只能在队列头尾操作元素,不能在中间操作元素
2.队列模块Queue的使用
from multiprocessing import Queue #导入队列模块
if __name__ == '__main__':
q = Queue(3) # 初始化一个Queue对象,最多可接收三条put消息
q.put('消息1') # put为写队列 get为读队列
q.put('消息2')
print(q.full()) #此时队列未满,故返回 False
q.put('消息3')
print(q.full()) # 此时队列已满,故返回True
# 由于消息队列已满,下面两个try都将抛出异常
# 第一个try等待2s抛出异常
try:
q.put('消息4',True,2) # True表示Blcok=True,此时是写阻塞的,
# 所谓写阻塞☞当队列被写满后,这段代码会一直阻塞,
# 直到等到别的进程/线程来取走(get)队列中数据
except:
print('消息对列已满,现有消息队列数量:%s' % q.qsize())
# 第二个try会立刻抛出异常
try:
q.put_nowait('消息4') # 不等待写入消息
except:
print('消息对列已满,现有消息队列数量:%s' % q.qsize())
# 读取队列中消息
if not q.empty(): # 读取消息时,先判断队列是否为空,再读取
print('-----从队列中读消息----')
for i in range(q.qsize()):
print(q.get_nowait()) # 不等待取出消息
# 写入消息
print('-----从队列中写入消息4----')
if not q.full(): # 判断队列中消息是否已满
q.put_nowait('消息4')
# 再次从队列中读消息
print('-----再次从队列中读消息----')
for i in range(q.qsize()):
print(q.get_nowait())
队列常用方法汇总:
Queue.Queue(maxsize=0) FIFO, 如果maxsize小于1就表示队列长度无限
Queue.LifoQueue(maxsize=0) LIFO, 如果maxsize小于1就表示队列长度无限
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 读队列,timeout等待时间
Queue.put(item, [block[, timeout]]) 写队列,timeout等待时间 ,block=True表示阻塞,False表示非阻塞
Queue.queue.clear() 清空队列
结果如下:
3.可用消息队列实现进程间通信
可以使用multiprocessing模块的Queue实现多进程之间的数据传递
例子如下:创建连个子进程,一个负责向队列中写入数据,一个负责从队列读取数据
# _*_ coding: UTF-8 _*_
# 开发团队 : 来者可追
# 开发人员 : Administrator
# 开发时间 : 2019/4/17 0017 下午 7:15
# 文件名称 : processpool.py
# 开发工具 : PyCharm
from multiprocessing import Process,Queue
import time
# 向队列中写入数据
def write_task(q): # 参数q为队列
# print(type(q))
if not q.full(): # 队列未满则写入
for i in range(5):
message = '消息' + str(i)
q.put(message) # 写入消息
print('写入:%s' % message)
# 从队列读取数据
def read_task(q):
time.sleep(1)
while not q.empty(): #队列不为空时
print('读取:%s' % q.get(True, 2)) # 2s未读取到任何消息则抛出异常
if __name__ == "__main__":
print('-----父进程开始-----')
q = Queue() # 父进程创建队列,并传给子进程
pw = Process(target=write_task, args=(q,)) # 实例化写数据进程
pr = Process(target=read_task, args=(q,)) # 实例化读数据进程
pw.start()
pr.start()
pw.join()
pr.join()
print('-------父进程结束--------')
结果如下:
Reference