龙卷风和异步请求处理

sky*_*ork 5 webserver asynchronous tornado

我的问题分为两部分:

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

  2. 在Tornado的情况下,"非阻塞"究竟是什么意思?这与上面的异步性有关吗?另外,我在某处读它总是使用单个线程来处理所有请求,这是否意味着请求是逐个或并行处理的?如果是后一种情况,龙卷风怎么做呢?

Col*_*ean 10

  1. Tornado使用异步,非阻塞I/O来解决C10K问题.这意味着所有I/O操作都是事件驱动的,也就是说,它们使用回调和事件通知,而不是等待操作返回.Node.js和Nginx使用类似的模型.例外tornado.database是阻塞.在龙卷风IOLoop源,如果你想详细了解一下是有据可查的.有关具体示例,请参见下文.

  2. 非阻塞和异步在Tornado中可互换使用,但在其他情况下存在差异; 这个答案给出了很好的概述.Tornado使用一个线程并按顺序处理请求,尽管非常快,因为没有等待IO.在生产中,您通常会运行多个Tornado流程.

至于一个具体的例子,假设你有一个HTTP请求,Tornado必须获取一些数据(异步)并响应,这里(非常粗略地)会发生什么:

  1. Tornado接收请求并在您的应用程序中调用适当的处理程序方法
  2. 您的处理程序方法使用回调进行异步数据库调用
  3. 数据库调用返回,调用回调,并发送响应.

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