How to get to root cause of Tornado "BadYieldError: yielded unknown object None"

How to get to root cause of Tornado "BadYieldError: yielded unknown object None"

在第二次 yield 时出现错误的代码存根如下:这里 ostream 是一个 tornado.process.Subprocess.STREAM 并且 cl 是一个 websocket.WebSocketHandlers and the function whose body the 的列表,其中包含装饰器 @web.asynchronous@gen.coroutine :

while True:
   data = yield self.ostream.read_until(b'CCMM\n')
   if data:
      data=data[:-1]+" "+str(cntr)
      for c in cl:
         yield c.write_message(json.dumps({"data":data}))

我在 tornado 4.3 上没有收到此错误,但我在 tornado 版本为 4.0 的机器上收到此错误:我假设 ostream 上的传入字节序列是相同的,因为 python 代码被打开'ed 是相同的。

我刚开始玩龙卷风,想知道如何调试为什么这似乎是 4.0 而不是 4.3 的问题。

看看docs for WebSocketHandler.write_message

Changed in version 4.3: Returns a Future which can be used for flow control.

在 4.3 版本之前,write_message 返回 None,因此不能与 yield 一起使用。如果您的应用程序需要对传出的 websocket 消息进行流量控制,则需要 Tornado 4.3 或更新版本。