英文:
Slow Python discord.py script
问题
有人知道为什么这个Python脚本运行得这么慢吗?
当我开始调用await member.remove_roles()和await member.add_roles()时,它开始变慢。当我注释掉这两行时,性能看起来还可以。
一些背景信息,我想要实现的目标是:
用户通过网站订阅。这些数据存储在MySQL数据库中。根据订阅,他们会被分配一个用户角色。
根据用户角色,我想在Discord服务器上分配相同的角色。
谢谢
英文:
Does anybody know why this python script is so slow?
It starts to become slow when I start to call the await member.remove_roles() and await member.add_roles(). When I comment the await member.remove_roles() and await member.add_roles() then the performance seems to look ok.
Some background what I want to accomplish.
User subscribe via a website. This data is stored into a mysql DB. Based on the subscription they got a user role assigned.
Base on that user role I would like to assign the same role on a Discord server.
Thx
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)
答案1
得分: 1
看起来你正在尝试迭代服务器中的每个成员,然后从在线数据库获取数据,而你的程序必须通过互联网连接到该数据库。根据你的互联网连接质量如何,这可能会变得很慢,当你必须为服务器上的每个成员执行此操作时,可能需要一些时间。
我相当肯定每个角色都有一个包含该角色成员的列表,所以最好的方法可能是只使用role.members
的for循环,然后移除包含该角色的成员。
以下是如何在文档中使用它。
英文:
It looks like you’re trying to iterate through every single member in the server, then fetch data from an online db that your program has to connect to over the internet. Depending on how good your internet connection is, this could become slow and when you have to do this for every single member on the server it could take some time.
Im pretty sure each role has a list of members with that role so the best way to go about it would be to probably just use a for loop for role.members
then remove members that contain that role.
Here’s how you use it in the documentation.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论