一、Tornado 简介
Tornado 是一个应用 Python 编写的高效、非阻塞的 web 服务器软件和网络库。它被设计用于解决数以千计的并发连贯,这是因为其非阻塞的 I / O 解决形式。Tornado 最后是由 FriendFeed 开发的,这是一个社交聚合服务,起初被 Facebook 收买。Tornado 通常被用于实时 Web 服务,须要解决大量长连贯的状况。
二、装置和 Hello World 示例
首先,咱们须要在 Python 环境中装置 Tornado。在命令行中输出以下指令即可:
pip install tornado
装置实现后,咱们能够编写一个最根本的 Tornado 利用,即 Hello World:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
上述代码定义了一个简略的 HTTP 服务器,对于根 URL(“/”)的 GET 申请,返回 ”Hello, world”。而后,咱们在本地的 8888 端口上启动了这个服务器。
三、路由和申请解决
在 Tornado 中,每个 HTTP 申请都由一个 RequestHandler
子类进行解决。这个子类须要定义一个对应于 HTTP 办法(如 GET 或 POST)的办法。在上述的 Hello World 示例中,咱们定义了一个 get()
办法来响应 GET 申请。
每个 RequestHandler
子类都关联一个 URL 模式,这个模式由 Application
的路由配置决定。例如,以下代码将 URL 模式 ”/user” 关联到了UserHandler
:
def make_app():
return tornado.web.Application([(r"/user", UserHandler),
])
这意味着,对于 URL”/user” 的申请,将由 UserHandler
进行解决。
四、模板和 UI
Tornado 蕴含一个弱小的模板语言,使得生成动静 HTML 变得简略。在 Tornado 模板中,咱们能够应用 Python 表达式,也能够应用控制流语句如 for 循环和 if 条件。
以下是一个 Tornado 模板的例子:
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{escape(item) }}</li>
{% end %}
</ul>
</body>
</html>
在这个模板中,{{title}}
和 {{escape(item) }}
是 Python 表达式,它们将被相应的值替换。{% for item in items %}
和 {% end %}
则形成了一个 for 循环,用于生成一个列表。
五、异步和非阻塞 I /O
Tornado 的一个重要特点是其反对异步和非阻塞 I /O。这使得 Tornado 能够在单个线程中解决数千个并发连贯,从而无效地解决高负载的实时 Web 服务。
在 Tornado 中,咱们能够应用 @tornado.gen.coroutine
装璜器和 yield
关键字编写异步操作,使得这些操作看起来像同步操作一样。例如,以下代码应用了 Tornado 的 AsyncHTTPClient
进行异步 HTTP 申请:
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response = yield http_client.fetch("http://example.com")
self.write(response.body)
上述代码中,http_client.fetch()
是一个异步操作,它将立刻返回一个 Future
对象。yield
关键字将暂停以后的协程,直到这个 Future
对象实现。在 Future
实现后,yield
表达式的值将是 Future
的后果,即 HTTP 响应。
六、WebSockets 和实时服务
Tornado 反对 WebSockets,这是一个在单个 TCP 连贯上提供全双工通信的协定。这使得 Tornado 能够很好地反对实时 Web 服务。
在 Tornado 中,咱们能够通过继承 WebSocketHandler
类并重写其办法来实现一个 WebSocket 服务。例如,以下代码实现了一个简略的回显 WebSocket 服务:
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
self.write_message("You said:" + message)
def on_close(self):
print("WebSocket closed")
七、论断
Tornado 是一个弱小的 Web 框架和网络库,它反对异步和非阻塞 I /O,反对 WebSockets,蕴含一个模板语言,并提供了对许多 HTTP 性能的低级别拜访。无论您是在构建一个实时 Web 服务,还是在寻找一个能解决高负载的 Web 框架,Tornado 都是一个值得思考的抉择。