我正在创建一个不和谐机器人,但我很难弄清楚异步/等待是如何工作的,以及如何解决我的问题。
所以这就是我要做的
我的机器人会发送一条消息,比如“我正在启动一个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)
我完全卡住了,我还没有得到异步/等待的东西,它显示。谢谢你的帮助。
1条答案
按热度按时间4ioopgfo1#
如果您不希望机器人冻结,请使用
asyncio.sleep
而不是time.sleep
。我试着让睡眠功能“异步”,但如果我不“等待”,然后我没有得到发射在所有。
是的,这就是async/await的工作原理。
在那之后我试着把函数放到一个线程中
不要使用线程来完成这个任务,这会使事情变得过于复杂。
asyncio.sleep
可以完成这项工作。如果我等待它,那么我的整个函数需要异步(为什么?如果我等待异步的东西,我不应该同步吗?)
不,等待只能在异步函数中完成。
await
挂起程序,并将控制权交还给事件循环,以便稍后在函数完成运行时返回。这是一个异步操作。在尝试这样的项目之前,您可能需要多阅读一些关于async的知识。Discord.py对初学者并不友好。