我知道tornado
和gevent
都是异步python框架。
在阅读bottle documentation时,我发现gevent实际上并非异步,并且您可以创建数千个与同步工作的伪线程。
顺便说一句,在gevent中,你不能提前终止请求处理程序,你需要返回完整的响应,而在龙卷风中你可以。 (如果我错了,请纠正我)
有些人可以详细描述这些系统如何在内部工作,以及它们的不同之处。另外,WSGI如何使用这些系统的异步特性?这些框架是否符合WSGI,如果是,如何?
答案 0 :(得分:24)
阅读:
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,如果阻塞点可以修补以便在事物阻塞时切换协同程序。
答案 1 :(得分:21)
gevent的主要亮点在于它利用协同程序并使代码看起来像是在同步运行,但实际上大多数IO阻塞函数都是非阻塞函数并且返回对gevent主循环的控制。这对于IO绑定编程非常重要,因为它允许您编写高效的单线程代码,就像编写多线程代码一样,这需要更多的资源。
gevent还包括一个WSGI请求处理程序,因此它可以用于以独立方式处理HTTP请求,如Tornado。
Tornado是一个异步的Web框架,它依赖于程序员在Python中编写异步代码,这在Backend
中通常是一种痛苦,因为没有多行匿名闭包或类,如JavaScript或Java。因此,使用Tornado编写好的代码真的很难。例如,使用阻塞库会变得很麻烦。
实际上两个框架的核心都是异步的,但结果代码看起来有点不同(更容易用gevent编程)。
你实际上可以一起使用Torando和gevent,但我还没有试过(还)。