Как найти причину Tornado "BadYieldError: получен неизвестный объект None"

Заглушка кода, которая получает ошибку при втором выходе, приведена ниже: здесь ostream - это tornado.process.Subprocess.STREAM а также cl это список websocket.WebSocketHandlers and the function whose body theS содержит декораторы @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}))

Я не получил эту ошибку на торнадо 4.3, но я получаю эту ошибку на машине, где версия торнадо была 4.0: я предполагаю, что входящая последовательность байтов в ostream идентична, потому что открываемый код python идентичен.

Я только начал играть с торнадо, и мне было интересно, как отлаживать, почему это проблема 4,0, а не 4,3.

1 ответ

Решение

Посмотрите документы для WebSocketHandler.write_message.

Изменено в версии 4.3: возвращает будущее, которое можно использовать для управления потоком.

До версии 4.3, write_message вернул None, поэтому он не может быть использован с yield, Если вашему приложению требуется управление потоком исходящих сообщений websocket, для него требуется Tornado 4.3 или новее.

Другие вопросы по тегам