为树中的生产者和消费者排队

时间:2009-10-02 19:26:18

标签: python queue

我正在阅读如何利用Python队列在节点之间发送和接收短消息。我正在模拟一组漂亮的树结构中的节点。我希望其中一些节点向其父节点发送固定大小的数据。一旦这个父节点从它的一些子节点接收数据,它将“处理”它并向父节点发送一个“聚合”数据包......依此类推。

要做到这一点,我被告知队列对于传递消息很有用,并且快速读取它会告诉我它将满足我的需要。但是,我发现实现基本设置并测试我的理解有点困难 - 1生成器(生成消息包)和1个消费者(使任务出列并处理它的工作线程)。

我在这里和其他地方搜索并阅读过很多帖子......我理解所有队列方法。我仍然不明白的是如何将队列关联或绑定到2个给定节点。

我希望node-1和node-2向node-3发送消息。对于这个基本场景,我必须以某种方式创建一个(或2个)队列并将其与node-1和node-2“关联”,它使用它将消息放入node-3。并且,node-3还必须与此队列“侦听”/“关联”以“获取”或将队列出列。

如果node-1和node-2是'producer',我应该将它们作为2个独立的线程,node-3作为第3个线程。然后,我必须创建一个队列Q.然后,我应该让node-1和node-2创建消息,将它们“放入”队列中。 Node-3必须“以某种方式”通知/唤醒以从Q获取这些消息并进行处理。

我见过

http://docs.python.org/library/queue.html#module-Queue

这是我到目前为止的(未经测试的)代码:

=============================================== ==================

import threading
import queue

q = Queue.Queue(2)   # create a queue of size 2.

# worker is node-3 which received msgs from 1 and 2 and fuses them.
def worker():
    while True:
        msg = q.get()
        fuse_msgs(msg)
        q.task_done()

# generate 3 worker threads. Node-3 could be both a producer and consumer. Each
# thread represents each node that will be a potential producer/consumer or both.
# need something like t1 - thread-1 for node-1 ...

for i in range(3):
     t = Thread(target=worker)
     t.setDaemon(True)
     t.start()

# How can I make node-1 and node-2 to put items into a specified queue???



for msg in source():
    q.put(item)

q.join()  

=========================================

我是朝着正确的方向前进的吗?请让我知道我错在哪里以及我误解了什么...

感谢任何帮助。我有数百个节点和链接。如果我能够顺利完成这些基础知识,我将能够顺利进行......

谢谢, B.R.Srini。

1 个答案:

答案 0 :(得分:1)

我不是特别评论python代码,但是就你的队列设计而言,你似乎只需要在你描述的节点1,2,3场景中需要一个队列。基本上,你有一个队列,你有节点1和节点2放置消息,节点3读取。

您应该能够告诉node-3对队列执行“阻塞”操作,因此它只会等到它看到要处理的消息,并让节点1和2快速生成输出尽可能。

根据每个节点的处理速度以及您期望的流量模式,您可能需要一个比2条消息更深的队列,这样生成节点就不必等待队列耗尽。