我不知道如何使异步函数不阻塞下一行代码/防止循环从顶部重新开始。
异步功能:
async def updateEmbed(self, ctx, obj: discord.Message):
while self.bot.toggle[ctx.guild.id] == 1:
mainembed = discord.Embed(title='Current Servers', colour=discord.Colour.purple(), timestamp=datetime.datetime.utcnow())
result = [[f'{key} | ({len(value)} players)', *value] for key, value in self.bot.scrimmatches[ctx.guild.id].items()]
for x in result:
people = []
for aperson in x[1:]:
person = self.bot.get_user(aperson)
people.append(f'{person.mention}\n')
mainembed.add_field(name=x[0], value=(''.join(people)))
await obj.edit(embed=mainembed)
await asyncio.sleep(5)
主要命令:
self.bot.toggle[ctx.guild.id] = 0
async with async_timeout.timeout(length):
try:
while True:
msg = await self.bot.wait_for('message', check=check)
await tryRemoveUser(self, ctx, user=msg.author)
try:
self.bot.scrimmatches[msg.guild.id][((msg.content).upper())].append(msg.author.id)
except:
self.bot.scrimmatches[msg.guild.id] = ((msg.content).upper())
if self.bot.toggle[ctx.guild.id] == 0:
self.bot.toggle[ctx.guild.id] = 1
await updateEmbed(self, ctx, obj=history)
except:
pass
在主命令上,我希望while True循环再次开始,但是该循环陷入了updateEmbed函数的while循环中,因此由于循环不重复,因此它停止读取消息。
答案 0 :(得分:0)
我不确定您正在使用该讨厌的代码做什么,但是您的updateEmbed
方法将永远不会停止,直到while self.bot.toggle[ctx.guild.id] == 1:
为真。
看看您编写的这段代码:
if self.bot.toggle[ctx.guild.id] == 0:
self.bot.toggle[ctx.guild.id] = 1
await updateEmbed(self, ctx, obj=history)
首先将self.bot.toggle[ctx.guild.id]
设置为1,然后再调用await updateEmbed(self, ctx, obj=history)
,因为它具有无限循环,它将永远不会结束:
while self.bot.toggle[ctx.guild.id] == 1:
永远都是正确的,因此永远循环,因为您永远不会将self.bot.toggle[ctx.guild.id]
更改为其他值。
不是进行一些讨厌的无限循环,而是转到Discord.Py rewrite API reference并使用events