один, как объяснено выше.

артная библиотека Pythonsocket.create_connection()Метод имеет опцию адреса источника для управления тем, какой IP-адрес источника используется соединением.

Как мне сделать то же самое с сокетом Python ZeroMQ, если у машины несколько адресов?

В этом случае я использовал Linux iproute2ip addr add создать адреса и ZeroMQPUB/SUB штепсельные архетипы.

 tink07 окт. 2017 г., 02:51
Я не думаю, что полностью понимаю проблему, которую вы пытаетесь решить ... если интерфейсы имеют определенные подсети, маршрутизация должна решить, где выходить, и если они этого не делают, действительно ли имеет значение, какую из них выбрать?
 ceridwen07 окт. 2017 г., 07:09
Я тестирую балансировку нагрузки третьего уровня, поэтому IP-адрес источника определяет, где заканчивается трафик.

Ответы на вопрос(2)

Решение Вопроса

При попытке.connect() я нашел ответ впротокольная документацияпоместите исходный ip перед точкой с запятой в строке подключения:

rc = zmq_connect( socket, "tcp://192.168.1.17:5555;192.168.1.1:5555" )

В Python это выглядит так:

socket = zmq.Context().socket( zmq.SUB )
socket.connect( 'tcp://192.168.1.17:5555;192.168.1.1:5555' )
 user366619724 окт. 2017 г., 22:21
Расширение списка через точку с запятой - это скорее побочный эффект «скрытой» функции API ядра ZeroMQ. Функционально создает то же самое, что и последовательность вызовов.connect()метод, независимо от того, использовал ли первыйtcp:// транспортно-класс а другойepgm:// один, как объяснено выше.
Ну, ZeroMQ немного сложно читать какsocket- «контрагент» ( это не )

классическаяsocket это бесплатный ресурс.

ZeroMQ - это довольно сложная иерархия идей и принципов поведения (лучше - распределенное поведение), которые помогают проектировать интеллектуальные распределенные вычислительные системы, не касаясь низкоуровневых (хорошо абстрагированных ZeroMQ) деталей, которые контролируют реальный поток событий в штормах. В суровых условиях все распределенные вычислительные системы открыты к лицу (и должны соответственно обрабатываться на низком уровне, если должны быть выполнены абстракции высокого уровня, «обещанные» ZeroMQ, чтобы сохранить их и облегчить умы дизайнеров, чтобы сосредоточиться скорее на своем / ее основная прикладная часть, а не перепроектирование колес (со всеми пробами и ошибками) для натягивания строк на ресурсы O / S и службы систем встряхивания для сбора всего лишь нескольких низко висящих видов фруктов).

По этим причинамлучше прямо забывай ZeroMQ быть "что-то вроде-socket"

Иерархия ZeroMQ менее чем за пять секунд

1:
ZeroMQ обещает простое повторное использование нескольких тривиальных масштабируемых формальных шаблонов связиархетипы предлагая определенное распределенное поведение{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }.

2:
За исключением случая исключительно использования толькоУстройство менее inproc:// транспортный класс, во всех остальных случаях ZeroMQ требуется один или несколько экземпляров настраиваемогодвигатель"-Context( nIOthreads = N ), N >= 1.

3:
Имея это, любое (будущееразъем ) Точка доступа может быть воплощено в жизнь, имея поведенческий архетип с самого момента рождения:

aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB )      # this is NOT a <SOCKET>
#                                 ^^^^^^__________________ even it was typed in

4:
Имея "Точка доступа"экземпляр готов" внутри "местного"двигатель"можно зафиксировать его материализацию во внешней реальности, используя одну или несколько (да, еще ... ВАУ! Имеется в виду большее количество поступающих натягивающих струн в / свистки, исходящих из одной точки доступа" поведенческий узел ") вызовы любого из этих методов:
.bind( <transport-class>://<a-class-specific-address> )
или же
.connect( <transport-class>://<a-class-specific-address> )

5:
Если и только если.bind()-RTO-готовая точка доступа A "посещается"первым живым.connect()-RTO-ready Точка доступа B, имеющая любое подходящее сопряжение поведения, запускает архетип ZeroMQ-обмена сообщениями / сигнализации (называя его такжеразъем вероятно использовался по историческим причинам, чтобы облегчить объяснение в разы)

( PUB/PUB по понятным причинам никогда не подойдетPUB/SUB и многие другие пары «поведение-архетип» будут прекрасно сочетаться и формировать взаимно «совместимые» поведения, которые, наконец, будут жить и оставаться такими)

Так,
как мне сделать то же самое с сокетом Python ZeroMQ,
дал машину, которая имеет несколько адресов?

Просто используйте полную спецификацию при звонке
.bind( "{ tcp | pgm | epgm }://<ip>:<port#>" ) метод и все готово.

Это просто.

Круто, не правда ли?

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

 user366619724 окт. 2017 г., 21:54
Рад, что вы нашли это полезным..connect() работает так же, как.bind()-метод делает. Важная и крутая вещь в том, чтоТочка доступа] Можно.connect( "tcp://<address>:<port>" ) а также.connect( "vmci://@:<port>" ) а также.connect( "ipc://<address_identifier>" ) и работать все эти установленные соединения под тем же [Точка доступа] модель формального коммуникационного поведения.Это было причиной для разработки всех деталей выше, чтобы начать понимать, насколько отличаются ZeroMQ-сокеты и какие огромные возможности они предоставляют для продвинутых распределенных систем.
 ceridwen24 окт. 2017 г., 20:20
Этот ответ очень полезен, но оказывается, что мой вопрос был не совсем ясен: мне нужно связать исходный ip для другого конца соединения, в методе connect. Я добавил ответ на этот вопрос и проголосовал за это.

Ваш ответ на вопрос