单一生产者多个消费者

JDD*_*JDD 6 python queue multithreading

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

  1. 制作人生成数据
  2. 消费者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()
Run Code Online (Sandbox Code Playgroud)

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

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

Dmi*_*ylo 3

你的制片人只创造了一项工作要做:

my_queue.put(my_list)
Run Code Online (Sandbox Code Playgroud)

例如,将 my_list 放入两次,两个消费者都工作:

def Producer():
    global my_queue
    my_list = []
    for each in range (50):
        my_list.append(each)
    my_queue.put(my_list)
    my_queue.put(my_list)
Run Code Online (Sandbox Code Playgroud)

这样,您就可以将两个作业放入同一列表的队列中。

但是我必须警告您:在没有线程同步的情况下在不同线程中修改相同的数据通常是个坏主意。

无论如何,使用一个队列的方法对您来说不起作用,因为一个队列应该使用具有相同算法的线程进行处理。

因此,我建议您继续为每个消费者使用唯一的队列,因为其他解决方案并不那么简单。