如何产生gen.coroutine方法

时间:2015-06-14 22:35:16

标签: python tornado

我正在使用以下类运行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 值?

我还需要屈服,当我把它称为I.e. yield self.application.db.add("test")

它目前在没有让我屈服的情况下工作,但是我想知道 屈服这是错误的,因为我知道它确实会返回 Future < / strong>对象?

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

1 个答案:

答案 0 :(得分:1)

是的,你应该“产生”对协程的任何调用。有两个原因:

  1. 如果你没有屈服,那么会产生协程并与调用协程同时运行。你可能想在“on_message”中执行下一个语句之前等待“add”完成?使“on_message”等待“add”完成的唯一方法是通过“add”返回Future。
  2. 如果“add”抛出异常 - 例如,如果您与数据库的网络连接失败,或者您的文档无效或违反了唯一索引 - 了解抛出异常的唯一方法是产生未来由“添加”返回。否则,将自动忽略该异常,请参阅the big warning in Tornado's coroutine documentation