Ошибка на oop через несколько часов Перезапись Discord.py (python) - PullRequest
1 голос
/ 10 апреля 2020

Во-первых, я француз, извините за мой плохой английский sh ...

У меня проблема. Мне не удалось создать нормальный Discord.py l oop, поэтому я сделал один сам:

@client.event
async def on_ready():
    game = discord.Game(f"{bot_version} | {len(client.guilds)} serveurs")
    await client.change_presence(status=discord.Status.idle, activity=game)
    print(f"Bot connecté en tant que : {client.user.name}")
    print(f"Le temps de chargement a été de : {loading_time} secondes")
    await client.wait_until_ready()
    #Loop part
    t = 0
    while not client.is_closed():
        for i in range(2):
            server_id = cursor.execute(f"SELECT server_id FROM 'servers' WHERE id={i+1}")
            server_id = server_id.fetchone()[0]
            server_id = int(server_id)
            #PV Démons
            ...
            ...
        #Time test
        print(t)
        t = t+4
        await asyncio.sleep(4)

Я сжал код, но на самом деле это более 150 строк.

Хорошо, теперь давайте объясним мою проблему: поэтому этот код повторяется каждые 4 секунды, но через 3/4 часа он повторяется дважды каждые 4 секунды (видео). Для своих тестов я сделал переменную, к которой добавляю 4 в конце l oop. Но через 3/4 часа эта переменная дублируется (видео).

Итак, мои вопросы: - Почему эта переменная дублируется? - Почему этот код повторяется дважды каждые 4 секунды? - Как я могу это исправить? - Как я могу сделать нормальный l oop на Discord.py Rewrite?

Видео: Видео об ошибке

Я надеюсь, что это объяснение чисто ! Заранее благодарю за ответ, Батист

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

В документации сказано, что событие: on_ready () . Может быть запущен несколько раз из-за логики переподключения c. Обычно бот не подключается через несколько часов. Это может объяснить, почему ваша проблема возникает только каждые 3/4 часа.

Более того, функция on_ready () не создана с идеей иметь бесконечное значение l oop (или любой вид продолжительной работы l * 1016). *). Как это обычно используется для настройки некоторых вещей. Когда функция on_ready () занимает более 4 часов и внезапно переподключается, вызывая запуск нового экземпляра on_ready (). Вы увидите двойные числа, как вы объяснили. Если мы хотим использовать эти длинные циклы while. Вместо этого я рекомендую использовать задачи.

Это также решит потенциальную проблему, которую дает событие on_ready (). Позволяя запускать только одну из этих задач одновременно.

Задачи используются для запуска содержимого в фоновом режиме. Вы можете активировать эти задачи в функции on_ready ().

Убедитесь, что ваша функция on_ready не выполняет фоновые операции в будущем. И не займет больше часа, чтобы завершить. Он используется для настройки, когда все готово. Не для выполнения задач в фоновом режиме (как объяснено, есть другие способы достижения этого).

0 голосов
/ 10 апреля 2020

это, вероятно, повторяется дважды, потому что вы делаете это

for i in range(2): 

, вы можете исправить это, сделав это вместо

for i in range(1):
...