Правильный способ обработки метода 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 записывает данные обратно в тот же поток. Это действительно то, что вы хотите сделать?

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