@tornado.web.asynchronous 装饰器是什么意思?

18 投票
3 回答
9053 浏览
提问于 2025-04-17 14:02
  1. 如果代码没有使用这个装饰器,那它是非阻塞的吗?
  2. 为什么叫做异步,这是不是意味着加了这个装饰器代码就变成异步了?
  3. 为什么 @tornado.gen 总是和 @tornado.web.asynchronous 一起使用?

3 个回答

0

@tornado.web.asynchronous 其实就是一个标记,你可以把它放在像 get()post() 这样的处理方法上。这个标记告诉框架,当这个方法执行完后,不要自动调用 finish(),因为这个方法里面有代码会在稍后某个时候去设置调用 finish()

5
  1. 在这里回答过: 异步与非阻塞

  2. 可以这样理解。当你需要向数据库或其他网址请求数据时,你不想让你的tornado IO停下来。所以使用@tornado.web.asynchronous可以让IO在等待内容加载(比如数据库或网址)时,继续处理其他请求。

  3. 它们是相似的。你很可能会使用@tornado.web.asynchronous

22

@tornado.web.asynchronous 这个东西的作用是让 RequestHandler 不会自动调用 self.finish()。简单来说,就是Tornado会保持连接一直开着,直到你手动调用 self.finish()

  1. 不使用这个装饰器的代码可能会阻塞,也可能不会。使用这个装饰器并不会改变这一点。

  2. 正如 @Steve Peak 所说,你在处理异步请求时会用到这个装饰器,比如从数据库获取数据的时候。

  3. 对于Tornado 3.1及以上版本:如果你使用 @gen.coroutine,就不需要再使用 @asynchronous 了。旧版的 @gen.engine 接口仍然需要 @asynchronous,我想是这样的。

撰写回答