为什么这段代码不等待,即使我使用等待asyncio.await()?

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

我正在尝试在我的discord bot中使用websocket。这段代码是分开的过程,我想统一流程。 discord.py使用websocket,所以我需要使用线程。要向频道发送消息,我需要等待协程。 time.sleep(),等待asyncio.sleep(),它们都没有工作。

@app.event
async def on_ready():
    print("로그인 정보>")
    print(app.user.name)
    print(app.user.id)
    print("=============")

    await app.change_presence(game=discord.Game(name="도움말을 받으려면 st!help ", type=1))

    async def on_message_live(ws, message):
        await asyncio.sleep(0.01)
        print(message)
        message = json.loads(message)
        if message["Type"] == 'UsersOnline':
            return
        if message["Type"] == 'LogOff':
            return
        if message["Type"] == 'LogOn':
            return
        gameid = list(message['Apps'].keys())[0]
        messageStr = "{} #{} - Apps: {} ({})".format(message['Type'], message['ChangeNumber'], message['Apps'][gameid],
                                                     gameid)
        if message['Packages'] != {}:
            packageid = list(message['Packages'].keys())[0]
            messageStr += ' - Packages: {} ({})'.format(message['Packages'][packageid], packageid);
        print(messageStr)
        for channel in realtimeList:
            app.send_message(app.get_channel(channel.id), messageStr)

    def on_error_live(ws, error):
        print(error)

    def on_close_live(ws):
        print("### closed ###")

    def on_open_live(ws):
        pass

    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://steamdb.info/api/realtime/",
                                 on_message=on_message_live,
                                 on_error=on_error_live,
                                 on_close=on_close_live)
    ws.on_open = on_open_live
    wst = threading.Thread(target=ws.run_forever)
    wst.daemon = True
    wst.start()

请忽略每一个糟糕的代码。

我想向频道发送消息。没有等待,我无法发送消息。

python discord.py
1个回答
1
投票

来自websocket_client项目描述:https://pypi.org/project/websocket_client/#description

所有API都是同步函数。

您正在将async函数传递给设计用于同步函数的API,因此它永远不会等待您传递给它的处理程序。等待处理程序中的某些事实并不意味着等待处理程序。

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