ZeroMQ Poller против Tornados EventLoop

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

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

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 ....

В случае Eventloop Но использование цикла обработки событий довольно элегантно, когда вы обрабатываете несколько сокетов, так как вы 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()

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

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

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

Другие вопросы по тегам