14

我知道两者tornado都是gevent异步python框架。

在阅读瓶子文档时,我发现 gevent 实际上不是异步的,您可以创建数千个同步工作的伪线程。

其次,在 gevent 中,您不能提前终止请求处理程序,您需要返回完整的响应,而在 tornado 中您可以。(如果我在这里错了,请纠正我)

有人可以详细描述这些系统如何在内部工作,以及它们有何不同。另外,WSGI 如何发挥这些系统的异步特性?这些框架是否符合 WSGI,如果是,如何?

4

2 回答 2

25

阅读:

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。

于 2012-10-10T05:57:34.200 回答
24

gevent 和 Tornado 有点不同。gevent 更像是 Twisted——一个异步网络框架,而 Tornado 是一个纯网络框架。

gevent 的主要亮点在于它利用协程并使代码看起来像是在同步运行,但实际上大多数 IO 阻塞函数都是非阻塞的,并将控制权返回给 gevent 主循环。这对于 IO 绑定编程非常重要,因为它允许您以与编写多线程代码相同的方式编写高效的单线程代码,这更加耗费资源。

gevent 还包括一个 WSGI 请求处理程序,因此它可以用于以独立的方式处理 HTTP 请求,例如 Tornado。

Tornado 是一个异步 Web 框架,它依赖于程序员在 Python 中编写异步代码,这通常很痛苦,Backend因为没有像 JavaScript 或 Java 那样的多行匿名闭包或类。因此,使用 Tornado 编写好的代码真的很难。例如,使用阻塞库变得很痛苦。

事实上,这两个框架的核心都是异步的,但生成的代码看起来有点不同(更容易用 gevent 编程)。

您实际上可以一起使用 Torando 和 gevent,但我还没有尝试过(还)。

于 2012-10-18T13:37:06.103 回答