Правильный способ обработки метода read_bytes в 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 at 0x7fd3ddf2ce18>, исключение =AssertionError('уже читается',)>) Traceback (последний вызов был последним): файл "/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, в лямбда-выражении f: f.result()) Файл "/server.py", строка 90, в handle_stream data = stream.read_bytes(1024, callback = self._on_read, part = True) Файл "/venv/lib/python3.6/site-packages/tornado/iostream.py", строка 432, в файле read_bytes future = self._set_read_callback(callback) ("обратный вызов)" / venv / lib / python3.6 / site-packages / tornado / iostream.py ", строка 859, в _set_read_callback assert self._read_callback имеет значение None, " уже читает "AssertionError: уже читается
1 ответ
Вы пытаетесь получить данные двумя несовместимыми методами, как через обратный вызов, так и в будущем. Ошибка не в stream.write, а при повторном вызове stream.read_bytes с обратным вызовом.
Поскольку обратные вызовы устарели, лучше всего использовать будущее. То есть как то так:
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 записывает данные обратно в тот же поток. Это действительно то, что вы хотите сделать?