Я хочу иметь одного производителя, многопользовательскую архитектуру в Python при выполнении многопоточного программирования. Я хотел бы иметь операцию так:Single Producer Multiple Consumer
- Производитель производит данные
- Потребители 1 ..n (N предопределено) ждать данных, чтобы прибыть (блок), а затем обработать те же данные в различные пути.
Поэтому мне нужны все потребители, чтобы получить те же данные от производителя.
Когда я использовал 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.
Спасибо за любой код/указатели!
Что помешало бы одному и тому же потребителю получить обе копии данных очереди? – martineau
@martineau спасибо, что указал. Ничего в действительности. Обновленный ответ. –
Хм даже с вашим обновленным ответом я все еще не понимаю, как вы можете справиться с проблемой @martineau? Вы имели в виду, что есть некоторые нетривиальные решения? Не могли бы вы упомянуть их? – max