如何并行运行Claude Code?

常识告诉我们应该尽可能避免多任务处理,因为它会分散注意力。然而,随着编码代理的兴起,并行工作已成为提高效率的必要条件。考虑到编码代理可能运行较长时间,你不想花时间等待它们完成。相反,你想要启动一个代理,当该代理工作时,开始另一个任务。

然而,并行启动任务并不简单。你需要考虑许多问题,例如:

  • 如何在同一个仓库中运行多个编码代理?
  • 如何仍然尽可能减少上下文切换?
  • 如何保持对所有运行中代理的概览?

我将在本文中涵盖所有这些要点,具体说明我如何处理这些问题以及我应用的解决方案。

1、为什么并行运行代理

与我写的许多其他文章一样,文章中描述的技术的主要原因是节省时间和作为工程师更高效。如果你想充分利用编码代理和我们在过去几年看到的令人难以置信的LLM发展,你需要并行化你的工作。

要理解原因,让我们想象相反的例子。想象一下只按顺序工作,就像LLM出现之前你通常编程时那样。使用编码代理的顺序编程看起来像这样:

  1. 找到你想做的任务
  2. 向代理描述它并制定计划
  3. 启动代理让它运行。等待直到它完成或需要你做什么
  4. 测试实现并迭代

每个任务需要多长时间会有很大差异。有时向代理描述任务和创建计划花费最多时间,但根据我的经验,第三步通常是耗时的步骤,特别是对于较大的实现,如实现新功能或解决复杂bug。

现在,为了变得更高效,我们想要做的是消除瓶颈。第三步是我们可以轻松最小化或消除的瓶颈。第一步和第二步很难变得更高效。你需要按顺序做这些并花时间在上面。第四步绝对是可以让更高效的,正如我在其他文章中描述的,比如我关于让Claude更擅长一次性实现的文章。因此,我将在本文中聚焦于第3步以及如何让它更高效。

2、如何并行运行代理

让第3步更高效的简单解决方案是并行运行代理。这在理论上听起来简单,但在实践中有效执行实际上更难。原因是并行运行任务会带来许多挑战。

你需要处理的一个挑战是代理互相覆盖代码。你不希望代理竞争编辑特定文件或测试自己的实现。

2.1 使用worktree在同一个仓库中运行多个代理

我要覆盖的第一个主题是如何在同一个仓库中运行多个代理。简单的答案是使用worktree。

你可以简单地指示你的代理使用worktree,这是一个git功能,本质上复制你的整个仓库。这样不同的代理可以在完全不同的仓库中工作。代理完成实现后,它可以被合并到主仓库的主分支中,通过这种方式,你可以有多个代理在同一个仓库中工作而不产生冲突。

然而,有时可能有更简单的方法来实现worktree设置。根据我的个人经验,我在使用Claude Code并要求它检出worktree时遇到了问题。Claude经常忘记实际检出一个新的worktree,然后在主仓库中开始工作。然后,当多个代理做同样的事情时,我开始遇到冲突。幸运的是,Claude Code实现了一个*--worktree命令*,你可以在启动云端代码时使用,如下所示:

claude --worktree

如果你在GitHub仓库中使用这个命令,Claude会基于现有仓库自动检出一个新的worktree,并将所有worktree存储在一个隐藏的Claude文件夹下。这极其有用,主要有两个原因:

  1. 你保证总是在使用worktree,你的代理不会互相干扰。
  2. worktree存储在隐藏的Claude文件夹中,而不是你的主文件夹。这大大减少了文件夹结构中的噪音,使得在需要手动浏览文件夹结构时更容易。

如果你使用其他编码代理,你可以弄清楚它们如何设置worktree,因为worktree正在成为任何编码代理程序越来越被期望的功能,比如像Cursor这样的IDE或像Claude Code这样的CLI。

2.2 最小化上下文切换

并行运行编码代理时需要考虑的第二个方面是你需要最小化上下文切换。我前面提到这主要来自两个方面。一是启动任务时,二是在任务过程中与代理交互时,比如代理向你提问,或完成实现后请你测试。

没有简单的解决方案来完全消除上下文切换,因为并行工作本质上意味着上下文切换。然而,有几件事我记在心里来最小化我的上下文切换。

我记住的第一件事是总是在移动到另一个任务之前完成当前任务。这在我描述时似乎非常明显;然而,我想提供一个具体的例子。

假设你有两个任务A和B需要做。任务A需要用户五分钟的交互,而任务B需要用户两分钟的交互,之后代理将运行十分钟完成任务。另外,你已经开始任务A,你的心理上下文当前在任务A上。

在这种情况下,很诱人的是从任务A切换到任务B,在任务B上做两分钟的设置,这样代理可以在你完成任务A时运行。然而,我敦促你尽可能避免这种情况,而是尝试完成你当前正在做的工作,然后移动到队列中的下一个任务,即使这乍看起来不是最优方法。

原因是,你当然可以看到完成每个任务需要多少分钟。任务A需要5分钟,任务B需要2分钟交互然后10分钟运行。然而,你看不到的是上下文切换的隐藏成本,我认为从任务A切换到B然后再切换回A会比简单完成任务A然后完成任务B花费更多时间。

我最小化上下文切换的第二种方式是减少电脑上的干扰。有很多方法可以做到这一点,但总的来说,我敦促你禁用所有通知。例如,我禁用了电脑上的Slack通知,也禁用了Slack应用上显示是否有消息等你的数字。我觉得这非常分散注意力,会使我从当前正在做的工作中失去专注和上下文。

此外,我尝试为每个我工作的仓库在终端设置中保持一个标签页。如果我在单个仓库中处理多个任务,我分割标签页。我将在下一节更详细地讨论我的终端设置。

2.3 保持对所有代理的概览

当你运行多个代理时,保持对所有代理的概览极其重要。然而,这不一定自然而然地做到,你需要做出主动选择来尽可能容易地获得概览。

这是我的终端设置发挥作用的地方。当我同时运行5到10个代理时,很容易混淆哪个代理在做什么以及你需要与什么交互。

对于终端设置,我使用Warp。我认为Warp是一个好的AI终端,有很好的自动补全,我可以轻松与之交互以有效使用Claude Code。

然后,如果我在一个仓库中运行多个代理——我经常这样做——我只需在Mac上使用CMD + D分割标签页。这样我为每个主标签页获得多个分割子标签页。这帮助我每个仓库只保持一个主标签页,同时在仓库中运行多个代理。

此外,我喜欢在Warp中将标签页重命名为仓库名称,这样容易导航到正确的标签页。并使用CMD 1/2/3等快速在不同标签页之间导航。当代理需要交互时,我会收到Warp的通知。

我还想指出,你可以使用许多其他设置来管理编码代理。首先,你可以使用不同的终端,这可能也工作得很好,不过我的偏好仍然在Warp。我知道的另一个好的替代方案是使用Claude应用程序或一个叫做Conductor的应用程序,它可以轻松概览你正在运行的不同仓库和编码代理。

总的来说,你的设置取决于你的偏好。如果你找到一个对你效果好的设置,我强烈建议使用该设置并坚持下去。

3、结束语

在这篇文章中,我讨论了如何高效并行化你的编程任务。你应该这样做的主要原因是作为工程师更加高效。如果你并行运行任务,你会比类似但按顺序运行任务的工程师效率高得多。然而,并行运行任务并不简单,你需要使用特定技术来保持对所有代理的概览、最小化上下文切换,并确保你的代理不会互相冲突。我相信我在本文中描述的概念是AI工作的未来。人类将成为AI代理的编排者,你需要能够高效并行化你的工作并启动代理完成特定任务,而只在需要时与代理交互。


原文链接:How to Run Claude Code Agents in Parallel

汇智网翻译整理,转载请标明出处