@tornado.web.asynchronous 装饰器是什么意思?
- 如果代码没有使用这个装饰器,那它是非阻塞的吗?
- 为什么叫做异步,这是不是意味着加了这个装饰器代码就变成异步了?
- 为什么 @tornado.gen 总是和 @tornado.web.asynchronous 一起使用?
3 个回答
0
@tornado.web.asynchronous
其实就是一个标记,你可以把它放在像 get()
或 post()
这样的处理方法上。这个标记告诉框架,当这个方法执行完后,不要自动调用 finish()
,因为这个方法里面有代码会在稍后某个时候去设置调用 finish()
。
5
在这里回答过: 异步与非阻塞
可以这样理解。当你需要向数据库或其他网址请求数据时,你不想让你的tornado IO停下来。所以使用
@tornado.web.asynchronous
可以让IO在等待内容加载(比如数据库或网址)时,继续处理其他请求。它们是相似的。你很可能会使用
@tornado.web.asynchronous
。
22
@tornado.web.asynchronous
这个东西的作用是让 RequestHandler
不会自动调用 self.finish()
。简单来说,就是Tornado会保持连接一直开着,直到你手动调用 self.finish()
。
不使用这个装饰器的代码可能会阻塞,也可能不会。使用这个装饰器并不会改变这一点。
正如 @Steve Peak 所说,你在处理异步请求时会用到这个装饰器,比如从数据库获取数据的时候。
对于Tornado 3.1及以上版本:如果你使用
@gen.coroutine
,就不需要再使用@asynchronous
了。旧版的@gen.engine
接口仍然需要@asynchronous
,我想是这样的。