Я работаю над приложением, где я хочу использовать ZeroMQ для подключения узлов разных типов, которые могут быть добавлены и удалены во время работы системы. Это означает, что я хочу позвонить zmq_connect()
или zmq_disconnect()
в любое время, когда узлы приходят и уходят.zmq_connect() сокет в ожидании zmq_send() или zmq_recv()
Некоторые разъемы для подключения типа типа ZMQ_REQ
, которые блокируются, когда нет равных. Таким образом, может случиться, что один узел заблокирован в zmq_recv(), без какого-либо узла, доступного для обработки запроса. Если тогда появится новый узел, я хотел бы подключить сокет, используя zmq_connect(). Единственный способ увидеть, как я могу это сделать, - вызвать zmq_connect() из другого потока. Но в документации четко сказано, что экземпляры zmq_socket
не могут использоваться одновременно из нескольких потоков.
Как решить эту проблему, отправив сообщения в сокет ZMQ_REQ
без каких-либо подключений (или соединения, которое невозможно установить), а затем добавить соединения и обработать ожидающие запросы?
Извините, что не возвращался к вам. Я использовал pyzmq для этого проекта и попытался использовать «poller» и локальное соединение между потоками для пробуждения потока ZMQ, но не смог его надежно работать. Вероятно, я или pyzmq испортил что-то, связанное с глобальным состоянием. Я скоро переделаю проект с помощью 'asyncio' stdlib и, возможно, просто использую что-то вроде [aiozmq] (https://github.com/aio-libs/aiozmq) и не беспокоюсь о деталях. :) – Feuermurmel