python多生产者和消费者_python – 单一生产者多个消费者

我希望在执行多线程编程时,在

Python中拥有一个单一的生产者,多个消费者体系结构.我希望有这样的操作:

>生产者生成数据

>消费者1 … N(N是预先确定的)等待数据到达(阻止),然后以不同方式处理SAME数据.

所以我需要所有消费者从生产者那里获得相同的数据.

当我使用Queue执行此操作时,我意识到除了第一个消费者之外的所有人都会因为我的实现而受到匮乏.

一种可能的解决方案是为每个消费者线程建立唯一的队列,其中生产者在多个队列中推送相同的数据.有一个更好的方法吗 ?

from threading import Thread

import time

import random

from Queue import Queue

my_queue = Queue(0)

def Producer():

global my_queue

my_list = []

for each in range (50):

my_list.append(each)

my_queue.put(my_list)

def Consumer1():

print "Consumer1"

global my_queue

print my_queue.get()

my_queue.task_done()

def Consumer2():

print "Consumer2"

global my_queue

print my_queue.get()

my_queue.task_done()

P = Thread(name = "Producer", target = Producer)

C1 = Thread(name = "Consumer1", target = Consumer1)

C2 = Thread(name = "Consumer2", target = Consumer2)

P.start()

C1.start()

C2.start()

在上面的示例中,C2会无限期地被阻塞,因为C1会消耗P1生成的数据.我想要的是C1和C2都能够访问由P1产生的SAME数据.

感谢您的任何代码/指针!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
和三个消费者,可以使用Python中的`queue`模块来实现。具体实现如下: ```python import queue import threading import time # 创建一个线程安全的队列 q = queue.Queue() # 生产者线程函数 def producer(): for i in range(10): # 将生产的物品放入队列中 q.put(f'product_{i}') print(f'Producer {threading.current_thread().name} produced product_{i}') time.sleep(1) # 消费者线程函数 def consumer(): while True: # 从队列中取出物品 item = q.get() if item is None: break print(f'Consumer {threading.current_thread().name} consumed {item}') time.sleep(1) # 创建3个生产者线程 for i in range(3): t = threading.Thread(target=producer, name=f'Producer_{i}') t.start() # 创建3个消费者线程 for i in range(3): t = threading.Thread(target=consumer, name=f'Consumer_{i}') t.start() # 等待所有生产者线程结束 for i in range(3): q.put(None) # 等待所有线程结束 for t in threading.enumerate(): if t != threading.current_thread(): t.join() ``` 在这个例子中,我们创建了一个线程安全的队列来存储生产者生产的物品,每个生产者线程都会往队列中放入10个物品,每个消费者线程都会从队列中取出物品并消费。为了让消费者线程能够在队列为空时等待生产者生产物品,我们使用了队列的默认阻塞行为。当队列为空时,`get()`方法会一直阻塞,直到队列中有物品为止。同理,当队列满时,`put()`方法也会阻塞。 最后,我们使用`None`来表示生产者已经生产完毕,消费者线程在取出`None`时就会退出循环,从而结束线程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值