不等待异步操作?不协调python bot

f4t66c6m  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(151)

我正在创建一个不和谐机器人,但我很难弄清楚异步/等待是如何工作的,以及如何解决我的问题。

所以这就是我要做的

我的机器人会发送一条消息,比如“我正在启动一个10分钟计时器,如果你想停止它,请点击表情符号的波纹管”,然后在消息中添加一个表情符号。然后它会启动一个休眠10分钟的功能。如果用户点击表情符号,它会被“on_reaction_add”捕获,停止等待(实际上它更新了一个布尔值).如果用户没有点击任何表情符号,在10分钟结束时,我的机器人会发送一条消息说“Timer 's up”.

问题:

我可以想出如何使计时器在运行时不停止整个程序(它实际上阻止了“on_reaction_add”)。

  • 我试着让睡眠功能“异步”,但如果我不“等待”,然后我没有得到发射在所有。
  • 之后,我尝试将函数放入线程中,但当计时器结束时,它需要发送一条消息说“Timer 's up”,这是一个异步函数,所以我需要再次等待它,然而,如果我等待它,那么我的整个函数需要异步(为什么?如果我等待异步的东西,我不应该同步吗?),然后我运行在与以前相同的问题。

下面是我尝试的代码片段:

t1 = Thread(target=SetTimer, args=[bs, channel, round])

t1=Thread(target=asyncio.run, args=(SetTimer(bs, channel, round),))

下面是我正在尝试做的一个例子:

# --- DISCORD ---
import discord
import time

ended = False
async def SetTimer(channel):
    print("lets wait")
    time.sleep(5)
    print("waiting ended")
    await End(channel)

async def End(channel):
    if ended == True:
        return
    ended = True
    await channel.send("This is the end")

TOKEN = "XXXXXXX"
class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged in as' + str(self.user.name))
        print('The chatbot Id :: ' + str(self.user.id))
    async def on_message(self, message):
        an_str = "Ok Let's start the timer\nClick on :white_check_mark: when you want to end it !"
        answer = await message.channel.send(an_str)
        await answer.add_reaction('✅')

        #Here start timer :
        SetTimer(message.channel)
    
    async def on_reaction_add(self, reaction, user):
        if reaction.message.author != client.user:
            return
        if reaction.message.content.startswith("Ok Let's start a") and reaction.count>1 and reaction.emoji == '✅':
            await End(reaction.message.channel)

我完全卡住了,我还没有得到异步/等待的东西,它显示。谢谢你的帮助。

4ioopgfo

4ioopgfo1#

如果您不希望机器人冻结,请使用asyncio.sleep而不是time.sleep
我试着让睡眠功能“异步”,但如果我不“等待”,然后我没有得到发射在所有。
是的,这就是async/await的工作原理。
在那之后我试着把函数放到一个线程中
不要使用线程来完成这个任务,这会使事情变得过于复杂。asyncio.sleep可以完成这项工作。
如果我等待它,那么我的整个函数需要异步(为什么?如果我等待异步的东西,我不应该同步吗?)
不,等待只能在异步函数中完成。await挂起程序,并将控制权交还给事件循环,以便稍后在函数完成运行时返回。这是一个异步操作。

async def some_function():
    # At this point you're basically saying
    # "Go do something else until g is done running, then continue"
    await g()

在尝试这样的项目之前,您可能需要多阅读一些关于async的知识。Discord.py对初学者并不友好。

相关问题