单产多用

2024-10-02 02:38:17 发布

您现在位置:Python中文网/ 问答频道 /正文

在执行多线程编程时,我希望在Python中有一个单生产者、多消费者的体系结构。我希望做这样的手术:

  1. 生产者产生数据
  2. 消费者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生成的相同数据。在

谢谢你的任何代码/指针!在


Tags: producer数据importqueuemydef消费者thread
2条回答

您的制作人只需创建一个作业:

my_queue.put(my_list)

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

^{pr2}$

这样你就可以用同一个列表将两个作业放入队列中。在

但是我必须警告你:在不同的线程中修改相同的数据而不进行线程同步通常是不好的主意。在

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

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

那么每个线程的队列怎么样?在

作为启动每个使用者的一部分,您还将创建另一个队列,并将其添加到“所有线程队列”的列表中。然后启动生产者,将所有队列的列表传递给它,然后他可以将数据推送到所有队列中。在

相关问题 更多 >

    热门问题