2012-05-11 164 views
5

我的问题是两部分:龙卷风和异步请求处理

  1. 究竟是什么意思的“异步服务器”,这是通常人们所说的龙卷风?有人可以提供一个具体的例子来说明概念/定义吗?

  2. 在Tornado的情况下,“非阻塞”究竟意味着什么?这与上面的异步性质有关吗?另外,我在某处总是使用单线程来处理所有请求,这是否意味着请求会按顺序逐一或并行处理?如果是后者,Tornado是如何做到的?

回答

10
  1. 龙卷风使用asynchronous, non-blocking I/O解决the C10K problem。这意味着所有I/O操作都是事件驱动的,也就是说,它们使用回调和事件通知,而不是等待操作返回。 Node.js和Nginx使用类似的模型。例外是tornado.database,这是阻止。 Tornado IOLoop source如果您想详细了解,有很好的文档记录。有关具体示例,请参见下文。

  2. 非阻塞和异步在Tornado中可互换使用,但在其他情况下有差异; this answer gives an excellent overview。龙卷风使用一个线程并按顺序处理请求,尽管非常快,因为没有等待IO。在生产中,您通常会运行多个Tornado流程。

至于具体的例子,比如说你有龙卷风必须获取的一些数据(异步)和响应HTTP请求,这里的(非常粗略的)会发生什么:

  1. 龙卷风接收请求并在您的应用程序中调用相应的处理程序方法
  2. 您的处理程序方法发出异步数据库调用,并带有回调
  3. 数据库调用返回,调用回调并发送响应。

Tornado(与例如Django相比)的不同之处在于,在步骤2和3之间,流程可以继续处理其他请求。 Tornado IOLoop只是保持连接打开并继续处理其回调队列,而使用Django(以及任何同步Web框架),线程将挂起,等待数据库返回。

+0

写得很好的答案。当你说'事件通知'时,你的意思是生成的事件表示I/O操作完成,以便调用回调函数?还有其他类型的事件吗?谢谢! – skyork

+0

是的,我的意思是通过epoll或kqueue通知Tornado传入数据,即边缘驱动的更改通知。 –