<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Concurrency on niuzj</title>
    <link>https://niuzj.org/tags/concurrency/</link>
    <description>Recent content in Concurrency on niuzj</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 13 Jul 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://niuzj.org/tags/concurrency/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Claude Code 工具并发机制：依赖与安全边界</title>
      <link>https://niuzj.org/posts/claude-code-tool-concurrency/</link>
      <pubDate>Mon, 13 Jul 2026 00:00:00 +0800</pubDate>
      <guid>https://niuzj.org/posts/claude-code-tool-concurrency/</guid>
      <description>&lt;p&gt;当模型在一条回复中返回多个 &lt;code&gt;tool_use&lt;/code&gt; 时，客户端应该并行执行，还是严格按数组顺序串行执行？&lt;/p&gt;&#xA;&lt;p&gt;只看 Anthropic API 的消息结构，很难得到完整答案。API 负责表达模型已经提交了哪些调用，却没有提供 &lt;code&gt;depends_on&lt;/code&gt;、&lt;code&gt;sequence&lt;/code&gt; 或 &lt;code&gt;parallel&lt;/code&gt; 之类的调度字段。真正执行这些调用的 Agent Runtime，还需要结合工具副作用、输入参数和当前执行状态做第二次判断。&lt;/p&gt;&#xA;&lt;p&gt;Claude Code 的处理方式可以概括为两层：模型负责表达语义依赖，Runtime 负责约束运行时安全。两层共同决定一次 Tool Call 最终以并发、串行还是动态交错的方式执行。&lt;/p&gt;&#xA;&lt;p&gt;本文涉及两类信息，适用范围需要先说明：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Anthropic API 的 &lt;code&gt;tool_use&lt;/code&gt; / &lt;code&gt;tool_result&lt;/code&gt; 消息结构以官方 &lt;a href=&#34;https://platform.claude.com/docs/en/agents-and-tools/tool-use/parallel-tool-use&#34;&gt;Parallel tool use&lt;/a&gt; 文档为准；&lt;/li&gt;&#xA;&lt;li&gt;Claude Code 的调度细节来自本机 &lt;strong&gt;Claude Code 2.1.207&lt;/strong&gt; 源码快照，基线构建提交前缀为 &lt;code&gt;bc512d563325&lt;/code&gt;，完整哈希见文末。内部函数、调用关系和默认值都属于特定版本的实现观察，不是 Anthropic API 的长期兼容协议，后续版本可能调整。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;api-表达调用runtime-决定执行方式&#34;&gt;API 表达调用，Runtime 决定执行方式&lt;/h2&gt;&#xA;&lt;p&gt;按照 Claude Code 的系统提示约定，两个互不依赖的文件读取可以出现在同一条 Assistant Message 中：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;toolu_01&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;file_path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src/a.ts&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;toolu_02&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Read&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;file_path&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;src/b.ts&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Claude Code 的提示约定下，这条消息表示模型认为两个调用在当前时点都已经具备提交条件。它没有进一步声明客户端必须并发执行，也没有声明二者存在先后关系。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
