正确处理 Tornado read_bytes 方法

Correct way of handling Tornado read_bytes method

我正在使用龙卷风开发 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)

但我面临以下问题:

tornado.application:Exception in callback functools.partial(.null_wrapper at 0x7fd3ddf2ce18>, exception=AssertionError('Already reading',)>) Traceback (most recent call last): File "/venv/lib/python3.6/site-packages/tornado/ioloop.py", line 758, in _run_callback ret = callback() File "/venv/lib/python3.6/site-packages/tornado/stack_context.py", line 300, in null_wrapper return fn(*args, **kwargs) File "/server.py", line 143, in lambda f: f.result()) File "/server.py", line 90, in handle_stream data = stream.read_bytes(1024, callback = self._on_read, partial = True) File "/venv/lib/python3.6/site-packages/tornado/iostream.py", line 432, in read_bytes future = self._set_read_callback(callback) File "/venv/lib/python3.6/site-packages/tornado/iostream.py", line 859, in _set_read_callback assert self._read_callback is None, "Already reading" AssertionError: Already reading

您尝试通过回调和未来两种不兼容的方法获取数据。错误不在 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 会将数据写回同一流。真的是你想做的吗?