在异步编程中为 True

问题描述 投票:0回答:1

我有这个功能:

async def on_event(event: dict):
    for func in MESSAGE_LISTENERS:
        await func(getMessage(event['data']))

这个装饰器将函数附加到

MESSAGE_LISTENERS
:

def on_message(func: callable):
    MESSAGE_LISTENERS.append(func)
    return func

这是当从服务器收到消息时运行函数

on_event
的代码:

async def run(self):
    async with websockets.connect(WS_URL, max_size=None) as ws:
        await self.__on_open(ws)
        while True:
            event = json.loads(await ws.recv())
            await on_event(event)

这是用法:

client = Client()

@on_message
async def onMessage(msg: Message):
    while True:
        print(f"Message '{msg.content}' was sent by the server")
        await asyncio.sleep(3)
       
asyncio.run(client.run())

现在,如果从服务器收到消息,我希望机器人每 3 秒打印一次消息,但是在收到第一条消息后,整个实例会冻结并且不会侦听/检测新消息。

我尝试过:

async def on_event(event: dict):
    for func in MESSAGE_LISTENERS:
        asyncio.create_task(func(getMessage(event['data'])))

但它仍然冻结。

python asynchronous websocket python-asyncio python-decorators
1个回答
0
投票

我用了await on_event(event) 并使用await,导致代码等待,直到on_event返回一个值,它永远不会返回值soo

替换 await on_event(event)on_event(事件)

© www.soinside.com 2019 - 2024. All rights reserved.