消息队列
1.定义
在消息传递当中,消息按照顺序传递,这种进程间通信的模式叫做消息队列,画个图帮助理解下
图中有进程A和进程B,然后为了在两个进程中通信,就在内存中开辟了一个空间叫队列C,多个进程都可以对这个队列C可见, 接下来
就是A进程往C队列里放消息,一次放一个,一次放一个消息,进程B作为接收端,一次从队列里拿出一个消息,一次
拿出一个消息,这样看起来和管道基本差不多,但实际上是python当中,他的函数为我们做了一个同化,队列里的
函数更加丰富,并且内部数据的组织结构不一样
3.创建队列
1.#在内存中开辟一个队列模型,用来存放消息,任何拥有队列对象的进程都可以进行消息存放和取出
multiprocessing-------> Queue
2.接口函数
1.q = Queue(maxsize=0) #创建消息队列对象
参数:
maxsize 默认为0,表示消息队列可以存放的消息由系统自动分配的空间而定,能存放多少个消息,由系统自动分配
>0正整数 表示消息队列中最多可以存放多少条消息(消息个数,不看字节大小)
返回值:
消息队列对象
2.q.put(‘xxx’)向消息队列存放一条消息,当消息队列满的时候会阻塞,存放的消息类型可以是数字,列表,字符串等等
3.q.full()判断队列是否满了,满了为True,否则为False
4.q.qsize()查看消息队列中消息的数量
5.q.get()获取消息,每次获取一条,当消息队列为空的时候,就发生阻塞
6.q.empty()判断消息队列是否为空,为空是True,不为空返回False
7.put,get中block参数和timeout参数
block默认为True,表示两个函数都是阻塞函数
block参数为False时,表示不阻塞
timeout 当block设置为True的时候表示超时等待时间,你可以给timeout设置时间
3.事例
1.判断队列是否满了
from multiprocessing import Queue
#创建消息队列,最多有三条
q = Queue(3)
#存放消息
i = 0
while True:
#q.full判断队列是不是满了
if q.full():
print('消息队列已经满了')
break
q.put('博主真帅'+ str(i))
i += 1
print('当前队列一共有%d条消息'%q.qsize())
打印结果为:
消息队列已经满了
当前队列一共有3条消息
2.获取消息
from multiprocessing import Queue
#创建消息队列,最多有三条
q = Queue(3)
#存放消息
i = 0
while True:
#q.full判断队列是不是满了
if q.full():
print('消息队列已经满了')
break
q.put('博主真帅'+ str(i))
i += 1
print('当前队列一共有%d条消息'%q.qsize())
#获取消息
for i in range(q.qsize()):
print('获取消息%s'%q.get())
#打印结果:
消息队列已经满了
当前队列一共有3条消息
获取消息博主真帅0
获取消息博主真帅1
获取消息博主真帅2
3.消息队列进程间的通信:
from multiprocessing import Queue,Process
from time import sleep
def func(name,q):
sleep(1)
q.put('博主真帅'+str(name))
if __name__ == '__main__':
q = Queue()
jobs = []
for i in range(10):
p = Process(target=func,args=(i,q))
jobs.append(p)
p.start()
#让所有子进程结束
for i in jobs:
i.join()
#先让子进程结束,消息也是可以取出来的
while not q.empty():
print(q.get())
解析:
这段代码时10个子进程往队列里放消息(也就是10条消息),主进程把消息取出来,子进程在睡眠的时候发生了阻塞
主进程阻塞在join,sleep睡眠之后,10个子进程把消息放入队列中,放入后子进程退出,1秒过后,join阻塞结束,
父进程开始获取消息,就把消息读取出来了