生产者消费者模型
生产者+消息队列+消费者模型
q = JoinQueue()
JoinableQueue: 每当你往该队列中存入数据的时候,内部有一个计数器+1,每当调用task_done()时候,计数器-1
q.join(): 当计数器为0时,才往下执行代码。
未使用JoinableQueue案例一:
from multiprocessing import Process, Queue
import time
import random
def producer(name,food,q):
for i in range(1,5):
data = "%s produce %s no. %s" % (name,food,i)
time.sleep(random.randint(1,3))
q.put(data)
print(data)
def customer(name,q):
while True:
data = q.get()
if data is None:break #检测到取到了标志位后循环停止
time.sleep(random.randint(1,3))
print("%s 吃了 %s" % (name,data))
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer,args=("hector",'brade',q))
p2 = Process(target=producer,args=("nico","rice",q))
c1 = Process(target=customer,args=("tom",q))
c2 = Process(target=customer,args=("lily",q))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join().
q.put(None). #在队列之后插入None标志位
q.put(None)。 #有几个消费者就要插入几个None
使用JoinableQueue模块案例二:标准的生产者消费者模型
from multiprocessing import Process, JoinableQueue
import time
import random
def producer(name,food,q):
for i in range(1,5):
data = "%s produce %s no. %s" % (name,food,i)
time.sleep(random.randint(1,3))
q.put(data)
print(data)
def customer(name,q):
while True:
data = q.get()
# if data is None:break
time.sleep(random.randint(1,3))
print("%s 吃了 %s" % (name,data))
q.task_done()
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer,args=("hector",'brade',q))
p2 = Process(target=producer,args=("nico","rice",q))
c1 = Process(target=customer,args=("tom",q))
c2 = Process(target=customer,args=("lily",q))
p1.start()
p2.start()
c1.daemon = True
c2.daemon = True #定义为守护进程,当q.join()执行时表示数据已被取完,那么主进程结束,那么守护进程将被杀死。
c1.start()
c2.start()
p1.join()
p2.join()
q.join() # 直到队列中的数据全部取完为0时,才往下执行代码

浙公网安备 33010602011771号