Кто-нибудь знает, почему этот скрипт на Python такой медленный?
Он начинает замедляться, когда я начинаю вызывать await member.remove_roles() и await member.add_roles(). Когда я комментирую await member.remove_roles() и await member.add_roles(), производительность выглядит нормально.
Некоторая предыстория того, что я хочу сделать. Пользователь подписывается через веб-сайт. Эти данные хранятся в БД mysql. На основании подписки им была назначена роль пользователя. На основе этой роли пользователя я хотел бы назначить ту же роль на сервере Discord.
Спасибо
import asyncio
import discord
import mysql.connector
import os
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
# Discord bot token
BOT_TOKEN = os.getenv("DISCORD_TOKEN")
DISCORD_SERVER_ID = os.getenv("DISCORD_SERVER_ID")
# Connect to the MySQL database
db_host = os.getenv("DB_HOST")
db_user = os.getenv("DB_USER")
db_password = os.getenv("DB_PASSWORD")
db_name = os.getenv("DB_NAME")
db_connection = mysql.connector.connect(
host=db_host,
user=db_user,
password=db_password,
database=db_name
)
db_cursor = db_connection.cursor()
# Create a Discord client
intents = discord.Intents.default()
intents.members = True
client = discord.Client(intents=intents)
async def updateActiveMemberRoles():
print('def executing')
await client.wait_until_ready()
# Get all the members in the guild
guild = client.get_guild(913107079605141525) # Replace with the ID of your Discord guild (SERVER ID)
while not client.is_closed():
ROLE_GOLD = guild.get_role(991694541298090059)
ROLE_BRONZE = guild.get_role(914277751719096381)
ROLE_VISITOR = guild.get_role(914280052424859700)
for member in guild.members:
DiscordName = member.name+"#"+member.discriminator
print(DiscordName)
db_cursor.execute("select membership_level from vw_discord_active_members where usrAccount = %s", (DiscordName,))
result = db_cursor.fetchone()
if result:
print(DiscordName+" "+result[0])
membership_level = result[0]
if membership_level == "gold":
await member.remove_roles(ROLE_VISITOR)
await member.add_roles(ROLE_BRONZE)
await member.add_roles(ROLE_GOLD)
print("gold")
elif membership_level == "bronze":
await member.remove_roles(ROLE_VISITOR)
await member.remove_roles(ROLE_GOLD)
await member.add_roles(ROLE_BRONZE)
print("bronze")
else:
await member.remove_roles(ROLE_BRONZE)
await member.remove_roles(ROLE_GOLD)
await member.add_roles(ROLE_VISITOR)
print("visitor")
print("------------------------------")
print("--- Wait 60 Seconds ----------")
print("------------------------------")
await asyncio.sleep(60)
@client.event
async def on_ready():
print("Bot is ready.")
client.loop.create_task(updateActiveMemberRoles())
client.run(BOT_TOKEN)






Похоже, вы пытаетесь выполнить итерацию по каждому члену на сервере, а затем получить данные из онлайн-базы данных, к которой ваша программа должна подключиться через Интернет. В зависимости от того, насколько хорошее у вас интернет-соединение, это может стать медленным, и когда вам нужно сделать это для каждого участника на сервере, это может занять некоторое время.
Я почти уверен, что у каждой роли есть список участников с этой ролью, поэтому лучший способ сделать это — просто использовать цикл for для role.members, а затем удалить участников, которые содержат эту роль.
Вот как вы используете его в документации .