Python中Tornado框架的常见疑惑与解答

本人最近想学习一下 tornado,但是发现网上关于 tornado 的资料很少,而且好多都是很早之前的技术文章,无意之间发现了 V2EX,就搜索了一下本站关于 tornado 的技术文章以及帖子,发现同样都是很早之前的,因此有一个疑问,现在已经很少或者已经没人使用 tornado 了吗? 本人是被 tornado 的异步特性吸引而来的,感觉使用 python3.x 的 async,uvloop 加上异步 postgresql 的 asyncpg 库,应该可以满足大多数的站点需求吧? 本人对这些还比较懵懂,还请 V2EX 的高手们指点一二。


Python中Tornado框架的常见疑惑与解答

10 回复

tornado 已经凉到这个贴 6 小时没人回的地步了,tornado 写法反人类,轮子不多,且在 Python3 时代有 async 存在,开源框架选型重在社区,老实用 DJango 和 Flask 吧


Tornado框架常见疑惑与解答

Tornado是一个高性能的异步网络库和Web框架,核心是基于事件循环的非阻塞I/O。以下是几个常见问题的解答:

  1. Tornado和Django/Flask的主要区别? Tornado是异步框架,适合高并发、长连接场景(如WebSocket)。Django/Flask是同步框架,更适合传统CRUD应用。选择取决于项目需求。

  2. 如何启动一个简单的Tornado服务?

    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, Tornado!")
    
    def make_app():
        return tornado.web.Application([
            (r"/", MainHandler),
        ])
    
    if __name__ == "__main__":
        app = make_app()
        app.listen(8888)
        tornado.ioloop.IOLoop.current().start()
    
  3. 如何处理异步请求? 使用async/await@tornado.gen.coroutine装饰器(旧版本)。例如:

    class AsyncHandler(tornado.web.RequestHandler):
        async def get(self):
            result = await some_async_function()
            self.write(result)
    
  4. Tornado支持WebSocket吗? 是的,通过tornado.websocket.WebSocketHandler实现:

    class WSHandler(tornado.websocket.WebSocketHandler):
        def open(self):
            self.write_message("Connected")
    
        def on_message(self, message):
            self.write_message(f"Echo: {message}")
    
  5. 如何部署Tornado应用? 通常搭配Nginx反向代理,用Supervisor管理进程。多进程模式可通过tornado.process.fork_processes()启动。

  6. Tornado的模板系统怎么用? 内置模板引擎,类似Jinja2。在Handler中使用self.render("template.html", data=data)渲染。

总结:根据场景选框架,异步需求用Tornado。

简直透心凉。不过我还是想着先把 tornado 学习一遍,然后写个项目练练手。大哥,有没有什么项目适合作为 tornado 练手用的?

我们的项目有用,对网络、数据库等耗时的 IO 操作全部使用了协程( async / await )封装。

看看 jupyter notebook,jupyterhub 吧

是关于数据处理的吗?

可以理解成一个用作数据处理的 web 应用。。

话说干嘛折腾这个?感觉国内除了遗留项目,基本都是用 django 或者 flask。。

如果是要用于写异步的应用,建议 Go 或者 NodeJs,异步支持好太多了,最近写 Tornado 的异步,各种异步驱动因为 2/3 版本分割导致不可用,然后能用的性能也不一定有保证

如果使用 go 的话,是不是就不需要异步驱动了? go 默认就开启了一个协程去做异步处理了?

go 在语言层面已经解决这些问题,但是开了 goroutine 以后,还是要加自己的控制在上面

回到顶部