【问题标题】:Tornado and asynchronous requests handlingTornado 和异步请求处理
【发布时间】:2012-05-20 02:57:38
【问题描述】:

我的问题分为两部分:

  1. “异步服务器”到底是什么意思,通常人们称之为 Tornado?有人可以提供一个具体的例子来说明这个概念/定义吗?

  2. 对于 Tornado,“非阻塞”到底是什么意思?这与上面的异步性质有关吗?另外,我在某处读到它总是使用单个线程来处理所有请求,这是否意味着请求是一个接一个地顺序处理还是并行处理?如果是后一种情况,Tornado 是怎么做到的?

【问题讨论】:

    标签: asynchronous webserver tornado


    【解决方案1】:
    1. Tornado 使用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。 Tornado 使用一个线程并按顺序处理请求,尽管速度非常快,因为没有等待 IO。在生产中,您通常会运行多个 Tornado 进程。

    就具体示例而言,假设您有一个 HTTP 请求,Tornado 必须(异步)获取一些数据并做出响应,以下是(非常粗略地)发生的情况:

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

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

    【讨论】:

    • 写得很好的答案。当您说“事件通知”时,您是指生成的事件以指示 I/O 操作完成以便调用回调吗?还有其他类型的事件吗?谢谢!
    • 是的,我的意思是 Tornado 通过 epoll 或者 kqueue 来通知传入的数据,也就是边缘驱动的变化通知。
    【解决方案2】:

    这是我对 web.py(cherrypy) 和 tornado 性能的测试。 how is cherrypy working? it handls requests well compared with tornado when concurrence is low

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 2011-06-23
      • 2019-06-04
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多