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

Python Discord程序结束时触发RuntimeError: Event loop is closed的解决方法

解决Discord.py中RuntimeError: Event loop is closed的问题

这个报错我之前也踩过坑,核心原因是client.run(TOKEN)本身会全权负责事件循环的启动、运行和收尾工作,你在on_ready事件里直接调用await client.close()会强制提前关闭事件循环,但client.run()后续还会尝试对已经关闭的循环执行清理操作,这就导致了冲突报错。

下面给你两种靠谱的解决方式:

方式一:手动管理事件循环(推荐)

如果你只是想让机器人启动后完成一次性任务(比如收集所有成员)就退出,那直接跳过client.run(),手动控制登录、连接和关闭的流程会更稳妥:

import asyncio
import discord

async def main():
    # 注意要开启对应的intents,不然可能拿不到成员列表
    client = discord.Client(intents=discord.Intents.all())  
    await client.login(TOKEN)
    await client.connect()
    
    # 简化你的成员收集逻辑,比逐个insert更高效
    members = []
    for guild in client.guilds:
        members.extend(guild.members)
    
    # 这里可以添加对members的后续处理
    print(f"总共收集到{len(members)}个成员")
    
    await client.close()

asyncio.run(main())

额外提醒:记得在Discord开发者后台开启Server Members Intent权限,不然guild.members会返回空列表哦。

方式二:在on_ready中异步执行关闭操作

如果你坚持要用client.run(),可以把关闭操作放到异步任务里执行,避免阻塞on_ready的执行流程,让client.run()能正常处理收尾:

import asyncio
import discord

client = discord.Client(intents=discord.Intents.all())

@client.event
async def on_ready():
    members = []
    for guild in client.guilds:
        members.extend(guild.members)
    
    # 用create_task异步执行关闭,让on_ready先正常结束
    asyncio.create_task(client.close())

client.run(TOKEN)

另外提个小建议:你原来代码里的members.insert(amount2, member)完全可以换成members.append(member),效果完全一样,还不用维护amount2这个变量,代码更简洁~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:27:59