首页 > 技术文章 > 生产者消费者模型 练习

poco 2021-04-27 15:13 原文

生产者消费者模型

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()

推荐阅读