处理龙卷风read_bytes方法的正确方法

时间:2018-08-22 09:53:52

标签: python-3.x tornado

我正在使用龙卷风开发python应用程序,我想在其中持续监听客户端发送的数据。 这是我的代码:

async def handle_stream(self, stream, address):
            try:
                while True:
                    data = stream.read_bytes(1024, callback = self._on_read, partial = True)
                    print(data)
                    stream.write(data)
            except StreamClosedError:
                logger.error("%s disconnected", address)

但是我面临以下问题:

  • 当我第一次发送数据时,它调用_on_read函数,但是第二次发送时,它不处理该数据。
  • stream.write(data)出现以下错误,
  

tornado.application:回调函数functools.partial(.null_wrapper位于0x7fd3ddf2ce18>处的异常,   exception = AssertionError('已读',)>)               追溯(最近一次通话):                 文件“ /venv/lib/python3.6/site-packages/tornado/ioloop.py”,行758,在   _run_callback                   ret = callback()                 文件“ /venv/lib/python3.6/site-packages/tornado/stack_context.py”,行   300,在null_wrapper中                   返回fn(* args,** kwargs)                 文件“ /server.py”,第143行,位于                   lambda f:f.result())                 文件“ /server.py”,第90行,在handle_stream中                   数据= stream.read_bytes(1024,回调= self._on_read,部分= True)                 文件“ /venv/lib/python3.6/site-packages/tornado/iostream.py”,第432行   read_bytes                   未来=自我._set_read_callback(回调)                 文件“ /venv/lib/python3.6/site-packages/tornado/iostream.py”,在第859行中   _set_read_callback                   断言self._read_callback为None,“已读”               AssertionError:已经阅读

1 个答案:

答案 0 :(得分:1)

您尝试通过回调和Future两种不兼容的方法获取数据。该错误不在stream.write中,而是在您通过回调第二次调用stream.read_bytes时。

callbacks are deprecated一样,最好的是利用未来。就是这样:

async def handle_stream(self, stream, address):
            try:
                while True:
                    data = await stream.read_bytes(1024, partial = True)
                    print(data)
                    # stream.write(data)
            except StreamClosedError:
                logger.error("%s disconnected", address)

此外,stream.write会将数据写回到同一流。这真的是您想要做的吗?