消息队列

消息队列

接触到多进程的朋友们应该知道,不同进程之间的数据是独立的,不共享的,不像多线程。那么如果我们需要不同进程之间互通一些消息呢?这个时候就要接触到这个知识点——消息队列了。消息队列(Message Queue),简单来说它是在消息的传输过程中保存消息的容器。消息队列最经典的用法就是消费者和生产者之间通过消息管道传递消息,消费者和生产者都是不同的进程。生产者往队列中写入消息,消费者从消息队列中读取消息。

多进程中multiprocessing模块提供了Queue和Pipe两种方法来实现

一、使用multiprocessing里面的Queue类来实现消息队列

import multiprocessing  #引入模块
q=multiprocessing.Queue() #创建消息队列
q.put(data) #生产消息
data=q.get() #消费消息

case:

import multiprocessing
def Write(q):
	for i in ['a','b','c','d']:
		q.put(i)
		print('消息队列中写入{}'.format(i))
def Read(q):
	while not q.empty():
		result=q.get()
		print('从消息队列中获取{}'.format(data))
def main():
	q=multiprocessing.Queue(5)
	mw=multiprocessing.Process(target=Write,args=(q,))
	mr=multiprocessing.Process(target=Read,args=(q,))
	mw.start()
	mr.start()
	mw.join()
	mr.join()
if __name__=='__main__':
	main()
	
output:
向消息队列中写入a
向消息队列中写入b
向消息队列中写入c
从消息队列中读取a
从消息队列中读取b
从消息队列中读取c

除此之外,Python3中其实也已经提供了专用的Queue模块,专门用来构造消息队列,它的使用方法和multiprocessing模块提供的queue类是一样的。queue类还提供了很多的方法,用来监控程序中消息队列中的运行状态。

  • Queue.qsize():返回queue的近似值。(注意:qsize>0时,不能保证get元素时不阻塞,qsize<maxsize时,不能保证put方法不阻塞。从官方文档的解释来看,这个qsize方法并不是很准确。具体需要参考Queue.py)
  • Queue.empty():判断队列是否为空。返回True or False (注意同上)
  • Queue.full():判断队列是否满。返回True ou False(注意同上)
  • Queue.put(item,block=True,timeout=None):往队列里放入数据。如果队列满了,blocking=False会直接报Full异常。如果blocking=True,就是等一会儿,timeout必须为0或者正数。None为一直等下去,0为不等,正数n为等待n秒期限,若n秒还不能存入,报Full异常。
  • Queue.put_nowait(item):往队列里存放元素,不等待。
  • Queue.get(item,block=True,timeout=None):从队列里取出数据。如果为空的话,blocking=False直接报empty异常。如果blocking=True,就是等一会儿,timeout必须为0或者正数。None为一直等下去,0为不等,正数n为等待n秒期限,若n秒还不能读取,报empty异常。
  • Queue.get_nowait():从队列里取出元素,不等待两个方法跟踪入队的任务是否被消费者daemon进程完全消费。
  • Queue.task_done():表示队列中某个元素被某个消费进程使用,消费结束发送的信息。每个get()方法调用时都会会拿到一个任务,其随后要调用task_done()方法。表示这个队列的某个元素已经被消耗了,发送消息告知。倘若当前消息队列设置了join()方法。即队列处于阻塞状态,当队列中的所有元素都被消耗完后,队列会重启。收到task_done()方法发送的调用完成信息。
  • Queue.join():这个方法会使程序阻塞,一直阻塞到队列中所有的元素都被进程消耗。当队列中未消耗的元素为0时,阻塞取消。(task_done用来配合join()方法)

通过multiprocessing中的Pipe来实现消息队列

  • pipe方法返回(conn1,conn2)代表一个管道的两个端口。pipe方法提供一个duplex参数,如果duplex参数为True(默认值),那么这个管道为全双工模式,即conn1和conn2都可收发。duplex为Flase时,conn1负责接收消息,conn2负责发送消息。
  • send和recv方法分别是发送和接收消息的方法。close方法表示关闭管道,当消息接收结束以后,关闭管道。

由于暂时没有接触到该方法,以后再补全。

posted @ 2020-02-16 16:14  Magic-Dater  阅读(122)  评论(0)    收藏  举报