Как циклично выполнять функцию каждую минуту без 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()