Очередь для производителей и потребителей в дереве - PullRequest
1 голос
/ 02 октября 2009

Я читаю, как использовать Python Queues для отправки и получения коротких сообщений между узлами. Я моделирую набор узлов, которые находятся в красивой древовидной структуре. Я хочу, чтобы некоторые из этих узлов отправляли данные фиксированного размера своему родителю. Как только этот родительский объект получает данные от некоторых дочерних узлов, он «обрабатывает» их и отправляет «совокупный» пакет его родительскому ... и т. Д.

Для этого мне сказали, что очереди будут полезны для передачи сообщений, и быстрое чтение говорит о том, что это будет соответствовать моим потребностям. Тем не менее, мне сложно реализовать базовую настройку и проверить мое понимание - 1 производитель (который генерирует пакет сообщения) и 1 потребитель (рабочий поток, который отменяет задачу и обрабатывает ее).

Я искал и читал много сообщений здесь и в других местах ... и я понимаю все методы очереди. Я до сих пор не понимаю, как связать или связать очередь с двумя указанными узлами.

Я хочу, чтобы узел-1 и узел-2 отправляли сообщения узлу-3. Для этого базового сценария я должен каким-то образом создать одну (или 2) очередь и «связать» ее с узлом-1 и узлом-2, который использует его для размещения сообщений в узле-3. Кроме того, узел-3 также должен быть «прослушивающим» / «связанным» с этой очередью, чтобы «получить» или удалить задачу из очереди.

Если узел-1 и узел-2 должны быть «производителями», я должен иметь их как 2 отдельных потока, а узел-3 - как третий поток. Затем я должен создать одну очередь Q. Затем мне нужно, чтобы узел-1 и узел-2 создавали сообщения, «помещали» их в очередь. Узел 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 Ответ

1 голос
/ 03 октября 2009

Я не комментирую, в частности, код Python, но что касается ваших очередей, кажется, вам просто нужна одна очередь в сценарии узла 1,2,3, который вы описывали. По сути, у вас есть одна очередь, в которой есть узел 1 и узел 2, куда отправляются сообщения, а узел 3 читает из.

Вы должны быть в состоянии указать узлу-3 выполнить «блокировку» попадания в очередь, поэтому он будет просто ждать, пока не увидит сообщение для его обработки, и покинет узлы 1 и 2, чтобы произвести их вывод так быстро насколько возможно.

В зависимости от скорости обработки каждого узла и ожидаемых шаблонов трафика, вам, вероятно, понадобится очередь глубже, чем 2 сообщения, чтобы производящим узлам не приходилось ждать, пока очередь будет опустошена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...