Как заставить асинхронную функцию работать в фоновом режиме? - PullRequest
1 голос
/ 07 апреля 2019

Я не могу понять, как заставить асинхронную функцию не блокировать следующую строку кода / не допустить повторного запуска цикла сверху.

Асинхронная функция:

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 запускался снова, однако цикл застревает в цикле while функции updateEmbed, поэтому он прекращает чтение сообщений, поскольку цикл не повторяется.

1 Ответ

0 голосов
/ 09 апреля 2019

Я не уверен, что вы делаете с этим неприятным кодом, но ваш метод 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. Перепишите ссылку на API и используйте события

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...