我的问题分为两部分:
“异步服务器”到底是什么意思,通常人们称之为 Tornado?有人可以提供一个具体的例子来说明概念/定义吗?
在 Tornado 的情况下,“非阻塞”到底是什么意思?这与上面的异步性质有关吗?另外,我在某处读到它总是使用单个线程来处理所有请求,这是否意味着请求是一个接一个地顺序处理还是并行处理?如果是后一种情况,Tornado 是如何做到的?
我的问题分为两部分:
“异步服务器”到底是什么意思,通常人们称之为 Tornado?有人可以提供一个具体的例子来说明概念/定义吗?
在 Tornado 的情况下,“非阻塞”到底是什么意思?这与上面的异步性质有关吗?另外,我在某处读到它总是使用单个线程来处理所有请求,这是否意味着请求是一个接一个地顺序处理还是并行处理?如果是后一种情况,Tornado 是如何做到的?
Tornado 使用异步、非阻塞 I/O来解决C10K 问题。这意味着所有 I/O 操作都是事件驱动的,也就是说,它们使用回调和事件通知,而不是等待操作返回。Node.js 和 Nginx 使用类似的模型。例外是tornado.database
,它是阻塞的。如果您想详细了解Tornado IOLoop 源代码,则有详细记录。具体示例见下文。
非阻塞和异步在 Tornado 中可以互换使用,尽管在其他情况下存在差异;这个答案提供了一个很好的概述。Tornado 使用一个线程并按顺序处理请求,尽管速度非常快,因为没有等待 IO。在生产中,您通常会运行多个 Tornado 进程。
至于一个具体的例子,假设你有一个 HTTP 请求,Tornado 必须(异步)获取一些数据并响应,这里(非常粗略地)会发生什么:
Tornado(与 Django 相比)的不同之处在于,在第 2 步和第 3 步之间,该进程可以继续处理其他请求。Tornado IOLoop 只是保持连接打开并继续处理其回调队列,而对于 Django(和任何同步 Web 框架),线程将挂起,等待数据库返回。
这是我对 web.py(cherrypy) 和 tornado 性能的测试。 樱桃是如何工作的?与龙卷风相比,当并发性较低时,它可以很好地处理请求