Может ли .select() работать как с традиционными сокетами, так и с сокетами ZeroMQ?

У меня есть поток, который ожидает ввода сигналов через ZMQ и сетевой ввод-вывод через TCP (и другой делает то же самое с UDP).

socket_tcp = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
socket_tcp.connect( ( self.config.tcp_ip, self.config.tcp_port ) )

while True:
    s_ready = zmq.select( [socket_zmq, socket_tcp], [], [] )[0]
        for sock in s_ready:
            # do stuff

Однако сокет TCP никогда не возвращается как доступный для записи (я убедился, что он действительно получает данные с помощью Wireshark).

В документации сказано, что я могу пройти

zmq.Socket или любой объект Python, имеющий метод fileno()
, который возвращает допустимый файловый дескриптор.

и я думаю, что последнее верно для socket.socket.

То же самое и с UDP.

Я что-то упускаю?

Нужно ли обрабатывать сокет ZMQ в отдельном потоке и передавать его сообщения с помощью ctrl_rcv, ctrl_snd = multiprocessing.Pipe()?

Или я могу использовать select в обоих мирах, как я и ожидал?


person Drak    schedule 30.12.2017    source источник


Ответы (2)


Поиграв с asyncio, я обнаружил, что zmq.asyncio прекрасно работает с моим вариантом использования. Он использует zmq.Poller() (как и zmq.select). Но почему-то работает...

В итоге я использовал ZMQSelector() с несколькими дополнительными строками кода:

import selectors
from zmq.asyncio import ZMQSelector

ctx = zmq.Context()
mixed_selector = ZMQSelector()
mixed_selector.register(sock_tcp, selectors.EVENT_READ)
mixed_selector.register(sock_zmq, selectors.EVENT_READ)

while True:
    fd_event_list = mixed_selector.select()
    for key, event in fd_event_list:
        sock = key.fileobj
        # do stuff
person Drak    schedule 01.01.2018

Не паникуйте (пока)

Что ж, в то время как недавний API ZeroMQ действительно предлагает прокси-сервер ZMQ_FD-file-descriptor для обращения к экземплярам сокета ZeroMQ, эти экземпляры являются лишь верхушкой "< em>hidden"-iceberg и ведут себя иначе, чем любая другая "общая" абстракция сокета, как опубликовано здесь, поэтому лучше забыть о ZeroMQ как о чем-то подобном- розетка"

Лучше
предупреждать как минимум об
основных концептуальных различиях в [ Раздел иерархии ZeroMQ менее чем за пять секунд ].

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

Если бы кто-то приложил все усилия для реализации сигнальной инфраструктуры ZeroMQ, было бы нонсенсом не использовать ее.

Так что лучше доставляйте межпотоковые сообщения лучше, чем ZeroMQ, лучше всего используя интеллектуальный транспортный класс inproc:// с нулевым копированием и избегайте каких-либо накладных расходов, связанных с платформой, которые multiprocessing.Pipe() дополнительно создадут только для перемещение (... и репликация) уже известных фрагментов данных (ZeroMQ может пользоваться правом сверхнизкой задержки из-за нулевого копирования, где это применимо).

person user3666197    schedule 30.12.2017
comment
Ну да, именно поэтому я использую ZeroMQ. - person Drak; 31.12.2017
comment
Рад, что это помогло. - person user3666197; 31.12.2017
comment
[Нажмите Enter для раннего] Но в какой-то момент приложение должно встретить классические сокеты (в потоке ввода-вывода). И я мог бы использовать select.select на трубе, но не на ZMQ. Итак, вопрос: как лучше всего получить сигнализацию (исходящую от ZMQ) в потоке ввода-вывода (обрабатывающем обычный сокет)? - person Drak; 31.12.2017
comment
Не стесняйтесь проверять другие мои сообщения о неблокирующих планировщиках, где операции ввода-вывода сокетов ZeroMQ происходят после получения всего лишь .poll()-сигнала о чем-то полезном, о чем нужно позаботиться, а не о чем-либо еще, и почувствовать бесплатно читайте также о других трюках с высокой производительностью. Кстати, Драку, какова ожидаемая пропускная способность [GB/s] и задержка [us] производительности потока ввода-вывода? - person user3666197; 31.12.2017