Как циклично выполнять функцию каждую минуту без time.sleep()?

Впервые делаю систему рангов на disnake.py, используя библиотеку pymongo. Написал простой рабочий код, и он полностью меня устраивает. Однако я хотел бы чтобы выдача опыта происходила лишь раз в минуту, дабы избавится от лишнего спама. Столкнулся с проблемой, что time.sleep() не подходит мне для этой задачи, поскольку он приостанавливает весь код. Пожалуйста, объясните мне сделать простой цикл для выполнения одной функции раз в минуту. Буду очень благодарен.

Код:

import disnake
from disnake.ext import commands
from pymongo import MongoClient
from random import randint
import config

class Rank(commands.Cog):
    def __init__(self, client):
        self.client = client
        self.cluster = MongoClient("mongodb+srv://<username>:<password>@cluster0.xv4lyer.mongodb.net/?retryWrites=true&w=majority")
        self.collection = self.cluster.name.collection

    @commands.Cog.listener()
    async def on_message(self, message):
        if message.author == self.client.user:
            return
        data = self.collection.find_one({"_id": message.author.id})
        goal = 5 * data["level"]**2 + 50 * data["level"] + 100

    #Выдача опыта

        elif data["exp"] <= goal:
            s = str(message.content)
            if s[0] == f"{config.tag}":
                return
            else:
                self.collection.update_one({"_id": message.author.id},
                    {"$set": {"exp": data["exp"] + randint(15, 25)}})

def setup(client):
    client.add_cog(Rank(client))


Ответы (1 шт):

Автор решения: denisnumb

Вместо time.sleep можно использовать await asyncio.sleep, но это только в асинхронных функциях.

Второй, более правильный вариант — использовать tasks:

from discord.ext import tasks

@tasks.loop(minutes=1.0)
async def my_task():
    # здесь действия, которые должны происходить каждую минуту
    . . .

@bot.event
async def on_ready():
    # запускаем задачу
    my_task.start()
    
→ Ссылка