![[BUG] CrewAI 1.4.1 hangs after successful kickoff_for_each() crew execution and never terminates](https://www.chat-gpts.plus/wp-content/uploads/2026/07/3871-4af0404f.jpg)
[BUG] CrewAI 1.4.1 hangs after successful kickoff_for_each() crew execution and never terminates
快速结论:该问题出现在使用 CrewAI 1.4.1 的 kickoff_for_each() 方法时,即便 Crew 执行成功,进程也会挂起不退出。优先排查是否由异步异常传播失败导致,建议升级到 CrewAI 1.6.1 或更高版本。
问题场景
用户在 Linux 环境中使用 CrewAI 1.4.1,通过 crew.kickoff_for_each() 运行 Crew。尽管日志显示 “Crew run completed”,但进程一直挂起,必须手动 Ctrl+C 终止。使用 crew.kickoff() 代替则不会出现挂起现象。
报错原文
[2025-11-09 05:41:41][INFO]: Crew run completed
Exception ignored in: <module 'threading' from '/usr/lib/python3.10/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.10/threading.py", line 1567, in _shutdown
lock.acquire()
KeyboardInterrupt:
原因分析
经过社区分析,这是一个典型的异步异常传播失败问题。具体原因包括:
- 异常被异步循环吞没:当某个子 Crew 执行失败时,异常未能正确传播,导致
asyncio.gather永远等待一个不会完成的任务 - 编排层缺少超时机制:虽然单个任务可能设置了超时,但
kickoff_for_each()编排层本身没有超时保护,导致无限挂起 - 资源未释放:失败的任务未释放连接、内存等资源,可能导致进程冻结
另一个潜在原因是追踪(tracing)机制在禁用后仍可能被触发,导致进程在后台等待 HTTP 响应或 SSL 连接超时。但即使设置了 CREWAI_TRACING_ENABLED=false,追踪信息仍然可能被收集。
环境排查
- CrewAI 版本(从 1.4.1 升级到 1.6.1 可解决)
- Python 版本(用户使用了 Python 3.10)
- 环境变量配置:确认
CREWAI_DISABLE_TELEMETRY、CREWAI_DISABLE_TRACING、CREWAI_TRACING_ENABLED等追踪相关变量是否已正确设置 - 是否已执行
crewai login(未登录时可能因 HTTP 401 导致挂起)
解决步骤
- 升级 CrewAI 版本:用户反馈升级到 CrewAI 1.6.1 后问题得到解决。
- 检查追踪设置:确保环境变量正确配置:
CREWAI_DISABLE_TRACING=true和CREWAI_TRACING_ENABLED=false。注意这些环境变量在 1.4.1 中可能不会完全生效。 - 使用 kickoff() 替代:如果无法升级,可优先尝试改用
crew.kickoff()代替kickoff_for_each()作为临时方案。 - 添加编排层超时:如果必须使用
kickoff_for_each(),可在外部包装异步超时逻辑。以下是可能修复模式(社区提供的解决方案):
async def resilient_kickoff_for_each(crews, timeout=300):
tasks = [asyncio.wait_for(crew.kickoff_async(), timeout) for crew in crews]
results = await asyncio.gather(*tasks, return_exceptions=True)
# Handle exceptions explicitly, don't swallow
验证方法
运行相同的 Crew 任务,使用 kickoff_for_each() 方法,确认进程在输出 “Crew run completed” 后能够正常退出,无需手动终止。检查是否还会出现追踪相关的 HTTP 请求日志(如 “Uploading trace batch”)。



