python-day9 队列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-day9 队列相关的知识,希望对你有一定的参考价值。
和开源软件MQ 很相似
先进先出的逻辑,一个,N个噻, 1个,N个听Q
from multiprocessing import Process,Queue
#队列,先进先出
q=Queue(3)
q.put({‘a‘:1})
q.put(‘b‘)
q.put(‘c‘)
print(q.full()) -->是否 噻满
q.put(‘d‘,False) #等同于q.put_nowait(‘d‘) 塞满后 再 噻,不 等待,直接报错
q.put(‘d‘,timeout=2) #塞满后 再噻 等待2秒, 不能噻就报错
print(q.qsize()) #查看q中 值的个数
print(q.get())
print(q.get())
print(q.get())
print(q.empty()) -->是否取空
print(q.get(block=False)) #等同于q.get_nowait(‘d‘) 听满后 再听,不 等待,直接报错
print(q.get_nowait())
print(q.get(timeout=2)) #听满后 再听 等待2秒, 不能听就报错
==========================模拟真实案例======================
吃包子, 厨师做,客户吃,相互 不干扰
def GET(q,name,li):
print(‘客户‘, name)
for line in li:
time.sleep(1)
print(‘客户吃了‘,q.get())
def PUT(q,name,li):
print(‘厨师‘,name)
for line in li:
time.sleep(1)
print(‘%s生产出%s‘ %(name,line))
q.put(line)
if __name__ == ‘__main__‘:
q=Queue()
li = [‘包子%s‘ % i for i in range(10)]
p=Process(target=PUT,args=(q,‘la‘,li))
p.start()
p1=Process(target=GET,args=(q,‘onda‘,li))
p1.start()
但是问题是,客户吃完后 不释放进程,还在卡住
===============================通过 put 提交一个 固定的值,让 get去 判断======================
def GET(q,name):
while True:
time.sleep(2)
res=q.get()
if res is None :break
print(‘客户%s, 吃了%s‘ %(name,res))
def PUT(q,name,li):
for line in li:
time.sleep(1)
q.put(line)
print(‘厨师 %s 只做了%s‘ %(name,line))
q.put(None)
if __name__ == ‘__main__‘:
q=Queue()
p1=Process(target=GET,args=(q,‘la‘))
p1.start()
li=[‘包子%s‘ %i for i in range(10)]
p2=Process(target=PUT,args=(q,‘onda‘,li))
p2.start()
p1.join()
p2.join()
print(‘主进程‘)
==============================或者使用 JoinableQueue===========
from multiprocessing import Process,JoinableQueue
import time
import random
def consumer(q,name):
while True:
# time.sleep(random.randint(1,3))
res=q.get()
q.task_done()
print(‘\033[41m消费者%s拿到了%s\033[0m‘ %(name,res))
def producer(seq,q,name):
for item in seq:
# time.sleep(random.randint(1,3))
q.put(item)
print(‘\033[42m生产者%s生产了%s\033[0m‘ %(name,item))
q.join()
print(‘============>>‘)
if __name__ == ‘__main__‘:
q=JoinableQueue()
c=Process(target=consumer,args=(q,‘egon‘),)
c.daemon=True #设置守护进程,主进程结束c就结束
c.start()
seq=[‘包子%s‘ %i for i in range(10)]
p=Process(target=producer,args=(seq,q,‘厨师1‘))
p.start()
# master--->producer----->q--->consumer(10次task_done)
p.join() #主进程等待p结束,p等待c把数据都取完,c一旦取完数据,p.join就是不再阻塞,进
# 而主进程结束,主进程结束会回收守护进程c,而且c此时也没有存在的必要了
print(‘主进程‘)
get()中
q.task_done() 每吃完一个,都会 汇报一下,直到吃完,
put()中
q.join(),等待 get()吃完, put就可以 获取到,然后向下 进行,
而此时 put() 还卡在 听q
get()
所以给 get()设置 守护进程, 在主进程释放后,将 get释放
主进程:
在让主进程通过 p.join() 等待 put()请求 结束 ,而put() 请求 会等get() 吃完, 最终 主进程才结束,然后 释放 get()
以上是关于python-day9 队列的主要内容,如果未能解决你的问题,请参考以下文章