python实现生产者消费者(多个生产者,多个消费者)

#2个生产者 与 多个消费者

import time
import queue

import threading
import random

from collections import deque

# 哨兵
_sentinel = object()
_sentinel2 = object()


class Producer(threading.Thread):
    """
    只负责产生数据
    """

    def __init__(self, name, queue):
        # python3的写法
        super().__init__(name=name)
        self._queue = queue

    def run(self):
        for i in range(5):
            print("{} 正在生产产品 {} 到队列里!".format(self.getName(), i))

            self._queue.put(i)
            time.sleep(random.randint(1, 20) * 0.1)

        # 设置完成的标志位
        self._queue.put(_sentinel)
        print("{}-完成".format(self.getName()))


class Producer2(Producer):

    def run(self):
        for i in range(65, 70):
            item = chr(i)

            print("{} 正在生产产品 {} 到队列里!".format(self.getName(), item))
            self._queue.put(item)
            time.sleep(random.randint(1, 20) * 0.8)

        # 设置完成的标志位
        self._queue.put(_sentinel2)
        print("{}-完成".format(self.getName()))


class Consumer(threading.Thread):
    """
    数据处理
    """

    _deque = deque()

    def __init__(self, name, queue, lock):
        super().__init__(name=name)
        self._queue = queue
        self._lock = lock

    def run(self):
        while True:
            value = self._queue.get(block=True, timeout=10)
            # 用来退出线程
            if value in (_sentinel, _sentinel2):
                with self._lock:
                    if value not in Consumer._deque:
                        Consumer._deque.append(value)

                self._queue.put(value)
                if len(Consumer._deque) == 2:
                    print('Consumer._deque  ==2  break')
                    break
            else:
                print("{}正在消费......{}在队列里已经被消费!".format(self.getName(), value))

        print("{}完成".format(self.getName()))


if __name__ == '__main__':

    q = queue.Queue()

    lock = threading.Lock()

    sentienl_queue = queue.Queue()

    producer = Producer('生产者1', q)
    producer2 = Producer2('生产者2', q)

    producer2.start()
    producer.start()

    consumer_threads = []
    for i in range(5):
        consumer = Consumer('消费者_' + str(i), q, lock)
        consumer_threads.append(consumer)
        consumer.start()

    for consumer in consumer_threads:
        consumer.join()

    producer.join()
    producer2.join()

    print('主线程已完成!')

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值