2015-09-28 1 views
0

Это мой план:
У меня есть много агентов и один менеджер агентов.
Если агент запускается, он свяжется с менеджером агента, говоря: Я агент.
Менеджер агентов может управлять всеми работающими агентами. Например, менеджер агента может сказать: agent1, PLZ что-то делать. Вот пример:
Как создать структуру с помощью ZeroMQ для этого случая

*****************      ********* 
* agent manager * <-----I'm agent1----- * Agent * 
*    * ---------OK---------> *  * 
*    *      *  * 
*    * ---calculate 1+1----> *  * 
*    * <-------It's 2------- *  * 
*    * -------go sleep-----> *  * 
*    * <--OK, I'm sleeping-- *  * 
*    * ------wake up-------> *  * 
*    * <---------OK--------- *  * 
*    * ---calculate 1+2----> *  * 
*    * <-------It's 3------- *  * 
*****************   ...   ********* 

Я рассматриваю с помощью REQ/REP, но, кажется, он не будет работать. Потому что все происходит так: запрос --- ответ --- ответ --- запрос --- ответ --- запрос ...

Кроме того, у нас может быть несколько агентов. Это означает, что менеджер-агент может одновременно управлять множеством агентов. Поэтому я хочу использовать многопоточность, но мой босс не согласен. На данный момент он хочет использовать монопоточность. Поэтому я думаю, что я должен использовать режим «неблокирования».

Так как я мог бы создать шаблон 0MQ для этого случая с неблокирующими?

ответ

2

Используйте дилера (агента)/маршрутизатора (агента). Они будут заменой REQ/REP, поскольку они более или менее идентичны, только с неструктурированным шаблоном связи. Ваш агент-менеджер получит идентификатор каждого Агента как часть связи в первом кадре сообщения. Он должен будет отслеживать эти идентификаторы, чтобы он мог инициировать связь с ними. Есть примеры того, как это работает в ZMQ guide, которые вы обязательно должны прочитать, если вы этого не сделали. В частности, взгляните на this section, чтобы увидеть, как это работает. Быстрая диаграмма:

DEALER1-setID('agent1')      ROUTER-bind() 
DEALER1-connect()--------------------------------> * 
DEALER1-send("I'm agent1")--------------> ROUTER-recv(['agent1', "I'm agent1"]) 
DEALER1-recv('OK') <----------------------ROUTER-send(['agent1', 'OK']) 



DEALER2-setID('agent2') 
DEALER2-connect()--------------------------------> * 
DEALER2-send("I'm agent2")--------------> ROUTER-recv(['agent2', "I'm agent2"]) 
DEALER2-recv('OK') <----------------------ROUTER-send(['agent2', 'OK']) 


DEALER1-recv('calc 1+1') <----------------ROUTER-send(['agent1', 'calc 1+1']) 
DEALER2-recv('calc 1+2') <----------------ROUTER-send(['agent2', 'calc 1+2']) 

DEALER1-send("It's 2")------------------> ROUTER-recv(['agent1', "It's 2"]) 
DEALER1-recv('go sleep') <----------------ROUTER-send(['agent1', 'go sleep']) 
DEALER2-send("It's 3")------------------> ROUTER-recv(['agent2', "It's 3"]) 
DEALER1-send("OK, I'm sleeping")--------> ROUTER-recv(['agent1', "OK, I'm sleeping"]) 

... и так далее. Я намеренно чередовал ответы на сообщения, чтобы продемонстрировать, как это может работать с более сложными заданиями, которые занимают разные промежутки времени. Способ получения ID ROUTER таким образом, который вы можете получить, и отправленный ROUTER, но отключенный DEALER, зависит от того, как работают эти типы сокетов. Вам просто нужно отслеживать эти идентификаторы, знать, какие из них используются, и отправлять их только тем, у кого еще нет работы, пока вы не получите ответ.

 Смежные вопросы

  • Нет связанных вопросов^_^