discord.py循环检测投票12小时到期导致机器人无法运行问题
解决嵌套循环导致机器人无法启动的问题
问题根源
你写的两层嵌套while True循环会直接阻塞机器人的主线程——主线程被无限循环完全占死,根本没机会运行机器人的核心事件逻辑(比如连接服务器、处理消息),所以机器人启动失败。
解决方案
方案1:用后台线程执行检测任务
把投票检测逻辑放到单独的后台线程,让主线程专注运行机器人:
import threading import time import datetime def check_votes(): while True: now = datetime.datetime.now() # 优化查询:直接找出投票时间超过12小时的用户 threshold = now - datetime.timedelta(hours=12) # 批量更新更高效 votedb.votes.update_many( {"voted": "true", "vote_time": {"$lt": threshold}}, {"$set": {"voted": "false"}} ) time.sleep(3600) # 每小时检测一次 # 启动后台线程,daemon=True确保线程随主程序退出 threading.Thread(target=check_votes, daemon=True).start() # 启动机器人 client.run("你的机器人Token")
方案2:用机器人框架自带的定时任务(推荐)
如果用的是discord.py这类异步机器人框架,用官方提供的tasks扩展更优雅,还能避免线程安全问题:
from discord.ext import tasks, commands import datetime bot = commands.Bot(command_prefix="!") @tasks.loop(hours=1) async def check_votes(): now = datetime.datetime.now() threshold = now - datetime.timedelta(hours=12) # 批量更新到期用户 votedb.votes.update_many( {"voted": "true", "vote_time": {"$lt": threshold}}, {"$set": {"voted": "false"}} ) @bot.event async def on_ready(): print("机器人已就绪") check_votes.start() # 机器人启动后开启定时任务 bot.run("你的机器人Token")
额外优化点
- 用
update_many替代遍历单个更新,减少数据库交互次数,提升效率 - 直接在数据库查询时过滤出到期用户,不用遍历所有已投票用户
内容的提问来源于stack exchange,提问作者TheRealKurumi
相关产品推荐
相关产品推荐

