【问题标题】:what does @tornado.web.asynchronous decorator mean?@tornado.web.asynchronous 装饰器是什么意思?
【发布时间】:2013-01-12 23:52:04
【问题描述】:
  1. 如果代码没有使用这个装饰器,它是非阻塞的吗?
  2. 为什么这个名字是异步的,意思是添加装饰器让代码异步?
  3. 为什么@tornado.gen 总是和@tornado.web.asynchronous 一起使用?

【问题讨论】:

  • 这看起来像是在 google 上搜索的精彩内容列表。
  • 搜索了很多不同的答案,完全搞不清哪个是正确的

标签: python tornado


【解决方案1】:

@tornado.web.asynchronousprevents the the RequestHandler from automatically calling self.finish()。而已;这只是意味着 Tornado 将保持连接打开,直到您手动调用 self.finish()。

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

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

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

【讨论】:

  • tornado 文档的链接已损坏。我猜它类似于tornadoweb.org/en/stable/gen.html?
  • 似乎在您的 GET/POST 完成后(协程完成),使用 @tornado.gen.coroutine 作为装饰器时请求会自动完成。使用异步时,必须调用 self.finish()
【解决方案2】:
  1. 在这里回答:asynchronous vs non-blocking

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2010-09-27
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多