总是平生未行处,醉来堪赏醒堪愁。
Tornado 是一个python web框架和异步网络库,最初开发于 FriendFeed . 通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,使其非常适合 long polling , WebSockets 以及其他需要与每个用户建立长期连接的应用程序。
import asyncio
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
async def main():
app = make_app()
app.listen(8888)
await asyncio.Event().wait()
# 同步并非使用了异步 异步往下看
if __name__ == "__main__":
asyncio.run(main())
线程和wsgi
通常,Tornado代码不是线程安全的。Tornado中唯一可以安全地从其他线程调用的方法是 IOLoop.add_callback . 您也可以使用 IOLoop.run_in_executor 在另一个线程上异步运行阻塞函数,但请注意,传递给 run_in_executor
应避免引用任何 Tornado 对象。 run_in_executor
是与阻塞代码交互的推荐方法。
asyncio
整合
Tornado与标准库集成 asyncio 模块和共享相同的事件循环(默认情况下,从Tornado 5.0开始)。通常,设计用于 asyncio 可以与 Tornado 自由混合。
import json
import tornado.ioloop
import tornado.web
import tornado.httpserver
from tornado.options import define, options
define('port', default=8000, help='default port', type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, Tornado")
def make_app():
return tornado.web.Application([
(r"/", IndexHandler),
])
if __name__ == "__main__":
tornado.options.parse_command_line()
app = make_app()
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()