2015-07-16 4 views
0

Я работаю над приложением, где я хочу использовать ZeroMQ для подключения узлов разных типов, которые могут быть добавлены и удалены во время работы системы. Это означает, что я хочу позвонить zmq_connect() или zmq_disconnect() в любое время, когда узлы приходят и уходят.zmq_connect() сокет в ожидании zmq_send() или zmq_recv()

Некоторые разъемы для подключения типа типа ZMQ_REQ, которые блокируются, когда нет равных. Таким образом, может случиться, что один узел заблокирован в zmq_recv(), без какого-либо узла, доступного для обработки запроса. Если тогда появится новый узел, я хотел бы подключить сокет, используя zmq_connect(). Единственный способ увидеть, как я могу это сделать, - вызвать zmq_connect() из другого потока. Но в документации четко сказано, что экземпляры zmq_socket не могут использоваться одновременно из нескольких потоков.

Как решить эту проблему, отправив сообщения в сокет ZMQ_REQ без каких-либо подключений (или соединения, которое невозможно установить), а затем добавить соединения и обработать ожидающие запросы?

ответ

0

Вы не должны использовать zmq_recv(), когда сообщения не готовы. Таким образом, вы избегаете блокировки потока. Вместо этого проверьте, действительно ли есть сообщение для получения. Самый простой способ добиться этого - использовать poller. Поскольку вы не указали, какую библиотеку или язык вы используете, я не могу дать вам правильный пример, но я предполагаю, что пример из примеров руководства ZeroMQ Guide может быть полезен here.

Создание приложений на основе ZeroMQ, по моему опыту, наиболее эффективно, создавая один поточный узел, который реагирует на сообщения и, при необходимости, запускает методы, основанные на временных интервалах.

Для создания такой системы, как вы говорите, я предлагаю вам взглянуть на главу Service Discovery удивительного ZeroMQ Guide.

+0

Извините, что не возвращался к вам. Я использовал pyzmq для этого проекта и попытался использовать «poller» и локальное соединение между потоками для пробуждения потока ZMQ, но не смог его надежно работать. Вероятно, я или pyzmq испортил что-то, связанное с глобальным состоянием. Я скоро переделаю проект с помощью 'asyncio' stdlib и, возможно, просто использую что-то вроде [aiozmq] (https://github.com/aio-libs/aiozmq) и не беспокоюсь о деталях. :) – Feuermurmel

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