生产者消费者模型
from multiprocessing import Process, Queue
import time
import random
def producer(queue, food,name):
# 生产的东西,放到Queue中
for i in range(1,11):
data = '%s:这个厨师,做了第%s个%s' % (name, i, food)
print(data)
# 模拟一下延迟
time.sleep(random.randint(1, 3))
queue.put('第%s个%s' % (i, food))
def consumer(queue,name):
# 消费者从queue中取数据
while True:
try:
res = queue.get(timeout=20)
# 模拟一下延迟
time.sleep(random.randint(1, 3))
print('%s这个消费者,吃了%s' % (name, res))
except Exception as e:
print(e)
break
if __name__ == '__main__':
queue = Queue(3)
##起了三个生产者
p1 = Process(target=producer, args=[queue, '包子','山治'])
p2 = Process(target=producer, args=[queue, '馒头','一乐大叔'])
p3 = Process(target=producer, args=[queue, '年糕','布林'])
p1.start()
p2.start()
p3.start()
# 起了两个消费者
c1 = Process(target=consumer, args=[queue, '路飞'])
c2 = Process(target=consumer, args=[queue,'鸣人' ])
c3 = Process(target=consumer, args=[queue,'索隆' ])
c4 = Process(target=consumer, args=[queue,'佐助' ])
c1.start()
c2.start()
c3.start()
c4.start()
from multiprocessing import Process, Queue
import time, random
def get_data(q, name):
while True:
data = q.get()
if data is None: # 获取结束信号,跳出死循环,不然等数据取玩了会一直卡在此处
break
time.sleep(random.randint(1, 3))
print('%s 取出了 %s' % (name, data))
def create_data(q, name):
for i in range(5):
time.sleep(random.randint(1, 3))
data = '%s元钱' % i
q.put(data)
print('%s 生产了 %s' % (name, data))
q.put(None) # 结束信号,不一定是None可以自己定义,就是告诉消费者已经停止生产数据了
if __name__ == '__main__':
q = Queue()
p1 = Process(target=create_data, args=(q, "生产者")) # 生产者
p1.start()
c1 = Process(target=get_data, args=(q, "消费者")) # 消费者
c1.start()