- 如果代码没有使用这个装饰器,它是非阻塞的吗?
- 为什么这个名字是异步的,意思是添加装饰器让代码异步?
- 为什么@tornado.gen 总是和@tornado.web.asynchronous 一起使用?
3 回答
@tornado.web.asynchronous
防止RequestHandler
自动调用self.finish()
。而已; 这只是意味着 Tornado 将保持连接打开,直到您手动调用self.finish()
.
不使用此装饰器的代码可以阻塞,也可以不阻塞。使用装饰器不会以任何方式改变这一点。
正如@Steve Peak 所说,您将装饰器用于异步请求,例如数据库检索。
Tornado 3.1+ 更新:如果你使用
@gen.coroutine
,你也不需要使用@asynchronous
。我相信旧的@gen.engine
界面仍然需要@asynchronous
。
在这里回答:异步与非阻塞
像这样想。当您需要请求说出数据库或其他 url 来检索数据时,您不想阻止您的 tornado IO。因此,
@tornado.web.asynchronous
它将允许 IO 在等待内容加载(例如数据库或 url)时处理其他请求。它们是相似的。您很可能会使用
@tornado.web.asynchronous
.
@tornado.web.asynchronous
本质上只是一个标记,您放置在处理程序方法上,例如get()
或post()
告诉框架它不应该finish()
在方法返回时自动调用,因为它包含将设置finish()
为稍后调用的代码。