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

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

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

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

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


person treecoder    schedule 10.10.2012    source источник
comment
я думаю, что мотор emptysquare.net/motor — это решение, которое проложило мост между ними: p   -  person Abdelouahab Pp    schedule 10.10.2012


Ответы (2)


Почитайте:

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, но система сопрограмм, поскольку она выглядит как потоки, может поддерживать WSGI, если точки блокировки можно исправить, чтобы переключать сопрограммы, когда что-то блокируется.

person Graham Dumpleton    schedule 10.10.2012
comment
Спасибо! Очень затягивающее объяснение! - person mannysz; 28.04.2014

gevent и Tornado немного отличаются. gevent больше похож на Twisted — асинхронный сетевой фреймворк, тогда как Tornado — только веб-фреймворк.

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

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

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

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

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

person Ron Reiter    schedule 18.10.2012
comment
+1, но вы забыли сказать, что у торнадо есть контейнер wsgi, который становится веб-сервером. - person BlaShadow; 07.09.2013
comment
Я не знаю, сложнее ли писать асинхронный код с Tornado. Во всяком случае, ключевое слово yield, которого пока не хватает в JavaScript, делает код очень чистым и простым для понимания. Нет передачи обратного вызова. Кроме того, централизованная обработка исключений в Tornado намного чище, чем, скажем, в NodeJS, где вы должны знать, что делаете, иначе вы получите утечку памяти. - person Andrei Taranchenko; 16.12.2014
comment
боль в бэкэнде - обожаю! - person FullStack; 01.07.2016