
RuntimeError: Executor is already running. Cannot invoke the same executor instance concurrently.
快速结论:该报错通常发生在使用 CrewAI 的 Agent 实例并行调用 akickoff() 且内部使用了实验性 AgentExecutor(并非 CrewAgentExecutor)时。优先排查是否因为同一个 Crew 实例被多个异步协程共享,或者确认 Agent 的 executor_class 是否被强制设为 CrewAgentExecutor。
问题场景
用户在 CrewAI 中使用 Crew 实例进行多次异步 kickoff(例如 asyncio.gather 同时调用 crew.akickoff()),或通过循环对同一 Crew 实例传入不同输入时,触发了错误。
报错原文
RuntimeError: Executor is already running. Cannot invoke the same executor instance concurrently.
原因分析
在 CrewAI 的代码仓库中,存在两个并行的 Agent 执行器实现:CrewAgentExecutor 和实验性 AgentExecutor。后者在 invoke_async 方法内实现了执行锁(execution lock),当同一个 AgentExecutor 实例被多个异步协程同时调用时,锁会阻止并发执行。而旧的 CrewAgentExecutor 没有此限制,允许同时运行多次 kickoff。该行为差异是架构缺陷(Issue 作者将其归类为 bug),两个实现覆盖了相同的职责,但 AgentExecutor 缺少与 CrewAgentExecutor 的特性对齐。
环境排查
- 确认 CrewAI 版本:如为
1.14.5a3(或接近主分支提交d165bcb6的版本),则可能已默认使用实验性AgentExecutor。 - 检查 Python 版本(通常 3.9+ 无额外约束)。
- 检查异步调用方式:是否使用
asyncio.gather多次调用同一 Crew 实例的akickoff()。
解决步骤
- 回退到旧执行器:在创建 Agent 时显式指定
executor_class=CrewAgentExecutor,例如:agent = Agent(..., executor_class=CrewAgentExecutor)注意:这可能会触发废弃警告(deprecation warning),但可恢复并发行为。
- 为每个输入创建独立的 Crew 副本:对于大量输入的情况,使用
akickoff_for_each方法(该方法内部会对 Crew 进行深拷贝)。这会避免共享同一个执行器实例,但可能带来性能开销。 - 避免复用 Crew 实例进行多次并发调用:如果必须使用实验性
AgentExecutor,则设计上应确保每个 Crew 实例只发起一次akickoff(),并等待其完成后再处理下一个输入。
验证方法
重新运行之前触发错误的异步并行代码(例如用 asyncio.gather 调用多个 crew.akickoff()),若不再出现 RuntimeError: Executor is already running,或原先需要深拷贝的行为已符合预期,则问题修复。



