You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:20:37