为什么即使我使用await asyncio.await(),此代码也没有等待?

时间:2019-04-22 14:25:59

标签: python discord.py

我正在尝试在不和谐的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()

请忽略所有卑鄙的代码。

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

1 个答案:

答案 0 :(得分:1)

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

所有API都是同步功能。

您正在将异步函数传递给旨在与同步函数一起使用的API,因此它永远不会等待传递给它的处理程序。您正在等待处理程序中的某些事实,并不意味着等待处理程序。