<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>分布式 on Chen Shungen</title><link>https://chenshungen.cn/tags/%E5%88%86%E5%B8%83%E5%BC%8F/</link><description>Recent content in 分布式 on Chen Shungen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 14:27:00 +0800</lastBuildDate><atom:link href="https://chenshungen.cn/tags/%E5%88%86%E5%B8%83%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 扩展并发原语与分布式并发</title><link>https://chenshungen.cn/blog/golang-concurrency/golang-extended-concurrency/</link><pubDate>Mon, 20 Apr 2026 14:27:00 +0800</pubDate><guid>https://chenshungen.cn/blog/golang-concurrency/golang-extended-concurrency/</guid><description>&lt;p>前面几篇我们讲了标准库的并发原语、atomic 和 Channel，掌握这些已经能解决 80% 的并发问题。但要进一步提升并发编程能力，还需要了解 &lt;strong>扩展并发原语&lt;/strong> 和 &lt;strong>分布式并发原语&lt;/strong>。这篇文章分两部分：上半部分讲 Go 官方和社区提供的进程内扩展原语（Semaphore、SingleFlight、ErrGroup、CyclicBarrier），下半部分讲基于 etcd 的分布式并发原语（Leader 选举、分布式锁、队列、栅栏、STM）。&lt;/p>
&lt;hr>
&lt;h1 id="上篇扩展并发原语">上篇：扩展并发原语&lt;/h1>
&lt;h2 id="一semaphore信号量">一、Semaphore（信号量）&lt;/h2>
&lt;h3 id="什么是信号量">什么是信号量？&lt;/h3>
&lt;p>信号量（Semaphore）是荷兰计算机科学家 Edsger Dijkstra 在 1963 年提出的并发原语，用来 &lt;strong>控制多个 goroutine 同时访问多个资源&lt;/strong>。&lt;/p>
&lt;p>它的核心是一个计数器（0 到 n），表示当前可用的资源数量：&lt;/p>
&lt;div class="highlight-wrapper">
 &lt;button class="copy-code-btn" type="button" aria-label="Copy code to clipboard">
 &lt;svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
 &lt;rect x="9" y="9" width="13" height="13" rx="2" ry="2">&lt;/rect>
 &lt;path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">&lt;/path>
 &lt;/svg>
 &lt;span class="copy-text">Copy&lt;/span>
 &lt;/button>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">┌────────────────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 信号量模型 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├────────────────────────────────────────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 初始资源数 = n │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Acquire (P 操作)：计数器 - 1 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 计数器 &amp;gt; 0 → 成功获取，继续执行 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 计数器 = 0 → 阻塞等待，直到有资源释放 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Release (V 操作)：计数器 + 1 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 唤醒一个等待中的 goroutine │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└────────────────────────────────────────────────────────────────┘&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>
&lt;blockquote>
&lt;p>&lt;strong>P/V 操作&lt;/strong> 的名称来自荷兰语：P（Proberen，尝试）减少信号量，V（Verhogen，增加）增加信号量。&lt;/p></description></item></channel></rss>