Опросчик ZeroMQ против Tornados EventLoop

С точки зрения дизайна и производительности, какой подход рекомендуется для обработки нескольких сокетов Zeromq и почему?

Верно ли, что IOLoop Tornado, используемый ZeroMQ, загружает меньше ЦП, чем Poller, используемый в цикле while для обработки нескольких сокетов?


person crashekar    schedule 25.06.2012    source источник


Ответы (2)


Было бы неплохо, если бы вы добавили к своему вопросу собственное наблюдение/анализ.

Я не думаю, что есть какая-то разница в производительности, но есть разница в дизайне.

В случае опроса

Вы регистрируете свои сокеты для опроса, а затем используете if blocks для идентификации каждого сокета и работы с ним.

while should_continue:
        socks = dict(poller.poll())
        if socket_pull in socks and socks[socket_pull] == zmq.POLLIN:
            Work_on_socket_pull ....

        if socket_sub in socks and socks[socket_sub] == zmq.POLLIN:
             Work_on_socket_sub ....

В случае цикла событий Но использование цикла событий довольно элегантно, когда вы работаете с несколькими сокетами, поскольку вы register callbacks.

stream_pull = zmqstream.ZMQStream(socket_pull)
stream_pull.on_recv(getcommand)

stream_sub = zmqstream.ZMQStream(socket_sub)
stream_sub.on_recv(process_message)

Как вы можете заметить из второго примера, блоки if удалены. Вы пишете свою операцию обмена сообщениями сокета в другом месте и регистрируете свои методы обратного вызова, когда сокет готов. In this case on_recv()

Я надеюсь, что это проясняет ваш вопрос.

person pyfunc    schedule 25.06.2012
comment
Спасибо за ответ. Из вашего ответа очевидно, что имеет смысл использовать цикл событий, поскольку система обратных вызовов делает код более читабельным. Я не уверен, что более эффективно. Поскольку цикл событий использует торнадо IOLoop, он также ускоряет работу? - person crashekar; 25.06.2012
comment
@crashekar: Нет, я не думаю, что это увеличивает производительность, но, как я предложил в своем ответе, более элегантно, когда вы пишете более сложные фрагменты информации. Ваш цикл обрабатывается циклом ввода-вывода Tornado, который выбирает и вызывает ваши обратные вызовы. В более сложном проекте это элегантно, потому что вы также регистрируете другие события с помощью цикла ввода-вывода и вызываете их через тот же интерфейс дизайна. - person pyfunc; 25.06.2012
comment
Позвольте мне подробнее остановиться на части производительности моего вопроса - правда ли, что конструкция while loop-poller загружает больше ЦП, а IOloop менее интенсивно использует ЦП? - person crashekar; 26.06.2012
comment
@crashekar: Опрос должен быть незанятым ожиданием. Не должно быть никакой загрузки процессора во время ожидания на сокетах. Сталкивались ли вы с какими-либо заметными проблемами производительности? - person pyfunc; 26.06.2012

Цикл ввода-вывода Tornado, повторно реализованный PyZMQ, в любом случае использует опросчик за кулисами, поэтому маловероятно, что один из них будет использовать больше ЦП, чем другой.

См. https://github.com/zeromq/pyzmq/blob/master/zmq/eventloop/ioloop.py для получения подробной информации.

person Rod Hyde    schedule 26.06.2012