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 для получения подробной информации.