深入理解 Web Server 原理与实践:Tornado

Tornado 是一个 Python web framework,同时也是一个 networking library,tornado 在 Python 2 上借力于各个平台的 IO 多路复用技术(epoll on linux,kqueue on BSD and Mac OS X )实现了一个基于事件的 IOLoop ,在 Python 3 上 tornado 的 IOLoop 封装的是 Python 3 的 asyncio 。

单线程的 IOLoop

Tornado 的 IOLoop 默认情况下是基于单线程的 ,虽然 tornado 支持在多线程中使用 IOLoop ,但是最终的 IO 处理最终还是要在 IOLoop 所在的线程中执行。

由于 torando 是单线程的,一个显著的问题就是如果一个请求中有阻塞调用,会导致整个 tornado 进程发生阻塞,从而让其他请求变慢甚至不可响应,因此 tornado 推荐在生产环境中启用多个 tornado 进程,每个进程的中的阻塞调用使用多线程或消息队列等异步调用模型。

Tornado 的高性能

借助于非阻塞的 network IO ,tornado 能够轻松应对大规模的并发连接,因而 tornado 的非常适合在 Long Polling 和 WebSockets 等其他需要长连接的应用程序中使用。

为什么 tornado 能够轻松扩展的数万的连接请求,结合本系列的主题我们来一起分析一下。

基于事件循环的 IOLoop

同 nginx 一样,tornado 利用了各个平台的高效的提供的高效的网络 IO 多路复用机制,使得在处理网络 IO 事件非常高效。

单进程单线程模型

单线程模型能够有效减少由于上下文切换导致的开销,能够充分利用单核 CPU,而且单线程模型使得编写应用程序无需担心共享资源的从而导致的锁开销,使得资源利用率更高。

Python 的协程支持

Tornado 在 Python 2 中实现了协程,在 Python 3 中使用原生的协程,借助协程在 tornado 中可以轻松编写基于多个网络 IO 的并发程序,使得应用程序在等待网络 IO 同时能够处理更多其他的应用程序逻辑,包括处理更多的连接请求。

异步

tornado 在处理网络 IO 的时候尽量使用异步执行,比如 tornado 提供的异步 httpClient 在处理 http 请求时可以结合 tornado 提供的携程轻松完成异步 http 请求,可以同时并发执行多个网络 IO 。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180729G0P3BW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券