【问题标题】:how to yield gen.coroutine methods如何产生 gen.coroutine 方法
【发布时间】:2015-06-14 22:35:16
【问题描述】:

我正在运行具有以下类的 Tornado 服务器:

class SessionHandler(tornado.websocket.WebSocketHandler):
   def open(self):
      pass

   def on_close(self):
      pass

   @tornado.gen.coroutine
   def on_message(self,message):
      #db added to the tornado application object on init
      self.application.db.add("test")
      x=self.application.db.get("test")
      print(x)

get函数如下(db类的一部分):

   @tornado.gen.coroutine
   def get(self,key):
      result=[]
      lookup=yield self.postCol.find_one({"_id":key})

      if not lookup:
         return result

      for id in lookup["FieldArray"]:
         ob=yield self.postCol.find_one({"_id":ObjectId(id)})
         result.append(ob)
      return result

我不会输入add() 函数。

我意识到get() 返回一个Future 对象而不是数组。没关系,我意识到我需要将代码更改为x = yield self.application.db.get("test")

我的问题是 add() 函数在我的方法中没有明确的 return 值?

当我也调用它时,我还需要 yield 吗? yield self.application.db.add("test")?

它目前确实可以在没有我让步的情况下工作,但是我想知道 yield 是否是一个错误 not,因为我知道它确实返回了一个 Future 对象?

如果是这样的话,这是否意味着我基本上必须yield我调用的任何用gen.coroutine装饰的方法?

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    是的,您应该“让步”对协程的任何调用。有两个原因:

    1. 如果您不让步,则生成协程并与调用协程同时运行。您可能希望在执行“on_message”中的下一条语句之前等待“add”完成?让“on_message”等待“add”完成的唯一方法是产生“add”返回的 Future。
    2. 如果“add”抛出异常——例如,如果您与数据库的网络连接失败,或者如果您的文档无效或违反唯一索引——知道抛出异常的唯一方法是产生“添加”返回的未来。否则异常会被静默忽略,请参阅the big warning in Tornado's coroutine documentation

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2017-09-25
      • 1970-01-01
      • 2013-06-22
      • 2014-06-05
      • 2015-06-29
      相关资源
      最近更新 更多