正确处理 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)
但我面临以下问题:
- 当我第一次发送数据时,它调用 _on_read 函数,但第二次,它不处理该数据。
stream.write(data)
给出如下错误,
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 会将数据写回同一流。真的是你想做的吗?
我正在使用龙卷风开发 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: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 会将数据写回同一流。真的是你想做的吗?