Я использую библиотеку pyzmq
, чтобы установить связь между двумя процессами python на одной машине. Рассматривая доступные шаблоны обмена сообщениями, предлагаемые ZMQ, неясно, какой из них подходит.
В моем случае оба процесса должны посылать независимо сообщения друг другу в некоторые случайные моменты времени. В основном в разные моменты каждый процесс является одновременно клиентом и сервером. Некоторое визуальное описание ниже. Подходящий шаблон messmage Zmq для коммуникационных процессов
Для достижения этой модели, я использую два ZMQ.PAIR
сокетов. Каждый процесс .bind()
-s гнездо для приема на нем и .connect()
-s к другому - .send()
всякий раз, когда это необходимо.
Аналогичным образом каждый имеет выделенный поток для обработки принимающего, который блокирует.
Однако этот дизайн мне кажется немного растянутым, и мне интересно, есть ли установка, более естественная и подходящая для этого сценария? Я также представляю, что это должно быть довольно распространенным явлением. В текущем проекте мне также не нравится тот факт, что мне нужно вручную позаботиться о чистке двух сокетов при завершении процессов.
В случае A) ясно, что для каждого процесса задействованы 2 сокета. Для случая B) мне не ясно, имеете ли вы один или два сокета в процессе.Один сокет будет означать, что пока поток ожидает приема в сокете, другой поток попытается написать. Если возможно, я бы предпочел этот вариант, так как его проще управлять, но безопасно ли использовать zmq-сокет таким образом? – steve
Сокеты ZMQ не являются потокобезопасными, поэтому вы не должны делиться одним сокетом между несколькими потоками (за исключением некоторых ограниченных условий, если вы знаете, что вы делаете, см. [Второй вопрос здесь] (http: // zeromq.org/area:faq#toc6)). Итак, нет, это небезопасно. Вам нужно * использовать блокирующий прием? Есть варианты не блокировать. Если вы блокируете свой приемный сокет, то этот сокет просто должен быть выделен для приема, и вам понадобится другой сокет для отправки, если только я не ошибочно не понимаю вашу архитектуру. – Jason
Думаю, мне нужно будет заблокировать. Я не могу предвидеть, когда другой процесс что-то пошлет. Если я не могу зарегистрировать обратный вызов для приема/обработки файлов. – steve