18
  1. 如果代码没有使用这个装饰器,它是非阻塞的吗?
  2. 为什么这个名字是异步的,意思是添加装饰器让代码异步?
  3. 为什么@tornado.gen 总是和@tornado.web.asynchronous 一起使用?
4

3 回答 3

22

@tornado.web.asynchronous 防止RequestHandler自动调用self.finish()。而已; 这只是意味着 Tornado 将保持连接打开,直到您手动调用self.finish().

  1. 不使用此装饰器的代码可以阻塞,也可以不阻塞。使用装饰器不会以任何方式改变这一点。

  2. 正如@Steve Peak 所说,您将装饰器用于异步请求,例如数据库检索。

  3. Tornado 3.1+ 更新:如果你使用@gen.coroutine,你也不需要使用@asynchronous。我相信旧的@gen.engine界面仍然需要@asynchronous

于 2013-01-30T13:38:52.303 回答
5
  1. 在这里回答:异步与非阻塞

  2. 像这样想。当您需要请求说出数据库或其他 url 来检索数据时,您不想阻止您的 tornado IO。因此,@tornado.web.asynchronous它将允许 IO 在等待内容加载(例如数据库或 url)时处理其他请求。

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

于 2013-01-29T21:24:45.780 回答
0

@tornado.web.asynchronous本质上只是一个标记,您放置在处理程序方法上,例如get()post()告诉框架它不应该finish()在方法返回时自动调用,因为它包含将设置finish()为稍后调用的代码。

于 2017-06-10T01:21:27.750 回答