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

为什么输入Discord指令后绑定的多进程循环任务没有正常执行?

问题原因分析
  • 核心错误:if __name__ == '__main__'使用逻辑错误
    该判断的作用是区分主进程与multiprocessing启动的子进程的执行逻辑,你将其放在on_message事件回调内部完全不符合规范。在Windows系统下,multiprocessing默认使用spawn模式启动子进程,会重新导入整个当前脚本文件,而原代码中client.run()没有包裹在if __name__ == '__main__'判断中,子进程导入脚本时会直接尝试重新启动Discord客户端,发生报错后直接退出,不会执行boop函数的循环逻辑。
  • 次要问题:异步回调中使用阻塞方法
    on_message是discord.py的异步事件回调,依赖asyncio事件循环调度,原代码中调用同步的time.sleep(1)会阻塞整个事件循环,即使进程能正常启动,也会导致机器人其他响应功能卡住。
  • 隐藏问题:缺少意图声明
    如果使用discord.py v2.0及以上版本,需要显式声明消息相关意图,同时在Discord开发者后台开启Message Content Intent开关,否则机器人无法读取用户消息内容,也不会触发.loop指令的对应逻辑。
修复后参考代码
import discord
import time
import multiprocessing
import asyncio

def boop():
    while True:
        time.sleep(1)
        print("I am looping.")

# 显式声明意图,适配高版本discord.py
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.content.startswith(".loop"):
        # 替换为异步休眠,不阻塞事件循环
        await asyncio.sleep(1)
        p1 = multiprocessing.Process(target=boop)
        p1.start()

# 将主进程启动逻辑包裹在判断内,避免子进程重复执行
if __name__ == '__main__':
    client.run("bruh im not sharing token")

内容的提问来源于stack exchange,提问作者Billy Hornets

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:06:03