Клиент веб-сокета Tornado: как выполнить asyn c on_message? (сопрограммы никогда не ждали) - PullRequest
0 голосов
/ 30 мая 2020

Как я могу заставить функцию on_message работать асинхронно в моем Tornado WebSocketClient?

Думаю, мне нужно дождаться функции on_message, но я не знаю как.

Или есть даже фундаментальное заблуждение относительно того, как я пытаюсь реализовать асинхронный WebSocketClient?

import tornado.websocket
from tornado.queues import Queue
from tornado import gen
import json


q = Queue()

class WebsocketClient():

    def __init__(self, url, connections):
        self.url = url
        self.connections = connections
        print("CLIENT started")
        print("CLIENT initial connections: ", len(self.connections))

    async def send_message(self):
        async for message in q:
            try:
                msg = json.loads(message)
                print(message)
                await gen.sleep(0.001)
            finally:
                q.task_done()

    async def update_connections(self, connections):
        self.connections = connections
        print("CLIENT updated connections: ", len(self.connections))

    async def on_message(self, message):
        await q.put(message)
        await gen.sleep(0.001)

    async def connect(self):
        client = await tornado.websocket.websocket_connect(url=self.url, on_message_callback=self.on_message)
RuntimeWarning: coroutine 'WebsocketClient.on_message' was never awaited
  self._on_message_callback(message)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

1 Ответ

0 голосов
/ 30 мая 2020

on_message_callback должна быть обычной функцией, а не сопрограммой. И он предназначен для использования в коде старого стиля, когда люди используют обратные вызовы вместо сопрограмм.

Для нового кода в стиле asyn c вам не нужен этот обратный вызов. Вы можете просто сделать это:

async def connect(self):
    client = await tornado.websocket.websocket_connect(url=self.url)

    while True:
        message = await client.read_message()

        if message is None:
            # None message means the connection was closed
            break

        print("Message received:", message)
        await q.put(message)
        await gen.sleep(0.001)
...