为什么输入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
相关产品推荐
相关产品推荐

