Обработчик веб-сокета on_close метод асинхронной реализации tornado

#python #python-3.x #websocket #tornado

#python #python-3.x #websocket #торнадо

Вопрос:

Я работаю над созданием веб-приложения с использованием tornado версии 6.0.2. Я использую обработчик WebSocket для настройки соединения с клиентом.

Пример реализации на стороне сервера:

 from tornado import websocket
import connectionhandler


class WebSocketHandler(websocket.WebSocketHandler):
    def initialize(self, connectionhandler):
        self.connectionhandler = connectionhandler

    async def open(self):
        print("WebSocket opened.")
        await self.connectionhandler.connection_established_websocket()

    async def on_close(self):
        print("WebSocket closed.")
        await self.connectionhandler.connection_closed_websocket()

 

Пример реализации на стороне клиента:

 ws = websocket.create_connection("ws://localhost:80/ws?")
ws.close()
 

Когда клиент устанавливает соединение, он вызывает метод open, и все работает правильно.

Но когда клиент закрывает соединение, я получаю сообщение об ошибке on_close, которое никогда не ожидалось.

Когда я удаляю собственную сопрограмму, метод on_close работает.

Вопрос :

Как я могу добавить собственные сопрограммы для метода on_close или вызвать асинхронный метод из on_close()?

Ответ №1:

on_close не предназначен для асинхронной функции. Чтобы запустить асинхронную функцию из on_close , используйте IOLoop.add_callback .

 from tornado.ioloop import IOLoop


def on_close(self):
     IOLoop.current().add_callback(
        self.connectionhandler.connection_closed_websocket
     )