Различия между gevent и торнадо

Я понимаю, что оба tornado и gevent являются асинхронными фреймами python.

При чтении документации флажка я обнаружил, что gevent фактически не является асинхронным, и вы можете создавать тысячи для псевдо-потоков, которые работают синхронно.

Сразу же, в gevent, вы не можете закончить обработчик запросов раньше, и вам нужно вернуть полный ответ, в то время как в торнадо вы можете. (исправьте меня, если я ошибаюсь здесь)

Может ли кто-то подробно описать, как эти системы работают внутри, и в каком смысле они разные. Кроме того, как WSGI играет с асинхронным характером этих систем? Соответствуют ли эти рамки WSGI, если да, как?

Ответ 1

Прочитайте:

http://en.wikipedia.org/wiki/Coroutines

и

http://en.wikipedia.org/wiki/Event-driven_architecture

http://en.wikipedia.org/wiki/Event-driven_programming

В пакете gevent используются сопрограммы, а Tornado управляется событиями.

Даже ведомые системы не легко сопоставляются с WSGI, но система coroutine, поскольку она похожа на потоки, может быть создана для поддержки WSGI, если точки блокировки могут быть исправлены для переключения сопрограмм, когда что-то блокирует.

Ответ 2

gevent и Tornado немного разные. gevent намного больше похож на Twisted - асинхронную сетевую структуру, тогда как Tornado - это только веб-структура.

Основная особенность gevent заключается в том, что он использует сопрограммы и делает код похожим на то, что он работает синхронно, но на самом деле большинство функций блокировки ввода-вывода являются неблокирующими и возвратными элементами управления в основной цикл gevent. Это очень важно для программирования, связанного с IO, поскольку оно позволяет писать высокоэффективный код с одним потоком так же, как вы пишете многопоточный код, который намного более ресурсоемкий.

gevent также включает обработчик запросов WSGI, поэтому его можно использовать для обработки запросов HTTP автономно, например, Tornado.

Tornado - это асинхронная веб-структура, которая опирается на программиста для написания асинхронного кода на Python, что часто является болью в Backend, потому что нет многострочных анонимных закрытий или классов, например, в JavaScript или Java. Поэтому писать хороший код с помощью Tornado очень сложно. Например, использование библиотек блокировки становится болью.

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

Вы можете использовать Torando и gevent вместе, но я еще не пробовал (пока).