<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Goroutine on PlumePHP</title><link>https://plumephp.com/tags/goroutine/</link><description>Recent content in Goroutine on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 13 Aug 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/goroutine/index.xml" rel="self" type="application/rss+xml"/><item><title>Delve 调试器深度使用指南：goroutine 回溯、条件断点与远程调试</title><link>https://plumephp.com/123-go-debug-delve/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/123-go-debug-delve/</guid><description>&lt;p&gt;Go 语言原生工具链在编译速度、性能分析和测试覆盖方面已经相当完善，但在&amp;quot;程序行为观测&amp;quot;这一维度，调试器的价值不可替代。当线上服务偶发卡死、CPU spike 无法复现、goroutine 泄漏日积月累时，&lt;code&gt;fmt.Println&lt;/code&gt; 式的调试手段不仅低效，还可能改变程序时序从而掩盖真正的 bug。本指南将系统性地介绍 &lt;strong&gt;Delve（dlv）&lt;/strong&gt;——Go 官方推荐、社区最活跃的调试器，帮助开发者从&amp;quot;打日志猜问题&amp;quot;进化到&amp;quot;精确控制执行流、逐帧分析状态&amp;quot;的专业调试水准。&lt;/p&gt;</description></item><item><title>Go 调度器 G-M-P 模型源码完全解析：从 goroutine 到线程的映射</title><link>https://plumephp.com/111-go-scheduler-gmp/</link><pubDate>Thu, 13 Aug 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/111-go-scheduler-gmp/</guid><description>&lt;h2 id="go-调度器的设计哲学为什么不用操作系统线程"&gt;Go 调度器的设计哲学：为什么不用操作系统线程&lt;/h2&gt;
&lt;p&gt;Go 语言将 goroutine 作为核心并发原语，其调度器的设计是整个语言运行时的灵魂所在。操作系统线程虽然是成熟的并发抽象，但在大规模并发场景下存在以下根本性问题。首先，线程的创建成本高昂。在 Linux 上创建一个线程需要分配栈空间（默认 8MB）、建立线程本地存储、注册到内核调度器，这些操作会带来数微秒甚至数十微秒的延迟。当应用需要同时运行数万乃至数十万个并发单元时，线程模型将耗尽系统资源。其次，线程上下文切换开销较大。CPU 在内核态和用户态之间切换需要保存和恢复寄存器状态、调整虚拟内存映射、刷新 TLB 缓存，在现代 CPU 上一次上下文切换的代价约为 1-2 微秒，而 goroutine 的切换仅需纳秒级别。&lt;/p&gt;</description></item><item><title>Goroutine：Go 的并发魔法</title><link>https://plumephp.com/11-goroutine/</link><pubDate>Wed, 13 Aug 2025 10:00:00 +0800</pubDate><guid>https://plumephp.com/11-goroutine/</guid><description>&lt;h2 id="goroutinego-的并发魔法"&gt;Goroutine：Go 的并发魔法&lt;/h2&gt;
&lt;p&gt;如果你问我 Go 语言最酷的特性是什么，我会毫不犹豫地回答：&lt;strong&gt;goroutine&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在当今这个多核 CPU 普及的时代，并发编程已经不是什么新鲜事了。但传统的并发模型——不管是 Java 的线程、Python 的多进程，还是 Node.js 的事件循环——都有各自的痛点：要么太重、要么太复杂、要么性能不够。&lt;/p&gt;</description></item><item><title>Go worker 取消入门：后台循环如何听懂 context</title><link>https://plumephp.com/go-worker-context-cancel-2025/</link><pubDate>Fri, 09 May 2025 13:37:00 +0800</pubDate><guid>https://plumephp.com/go-worker-context-cancel-2025/</guid><description>&lt;p&gt;后台 worker 是 Go 服务里很常见的结构：消费队列、定时清理、同步外部数据、处理导入任务。很多 worker 写起来很简单，但停不下来。服务收到关闭信号后，HTTP server 已经退出，worker 还卡在 sleep、网络请求或 channel receive 上，进程迟迟不结束。&lt;/p&gt;</description></item><item><title>Go 并发入门：goroutine、channel 和 context 怎么一起用</title><link>https://plumephp.com/go-goroutines-channels-and-context/</link><pubDate>Tue, 25 Feb 2020 14:55:00 +0800</pubDate><guid>https://plumephp.com/go-goroutines-channels-and-context/</guid><description>&lt;h2 id="go-的并发为什么容易上手也容易误用"&gt;Go 的并发为什么容易上手也容易误用&lt;/h2&gt;
&lt;p&gt;Go 最吸引人的特性之一是并发。启动一个 goroutine 只需要在函数调用前加 &lt;code&gt;go&lt;/code&gt;，channel 可以在 goroutine 之间传递数据，&lt;code&gt;select&lt;/code&gt; 可以等待多个通信事件，&lt;code&gt;context&lt;/code&gt; 可以传递取消信号和超时。相比手动管理线程，这套模型轻很多。&lt;/p&gt;</description></item></channel></rss>