当前位置: 首页 > news >正文

编程语言:Go语言并发编程实战

编程语言:Go语言并发编程实战

大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊Go语言并发编程这个重要话题。作为一个全栈开发者,Go语言以其出色的并发支持而闻名。今天就来分享一下Go语言并发编程的实战经验。

Go并发概述

Go并发模型

Goroutine → 轻量级线程 Channel → 通道通信 Select → 多路复用 Sync包 → 同步原语

并发优势

特性说明
轻量级每个Goroutine只需几KB栈空间
高效多路复用减少上下文切换
简洁语法层面支持并发

Goroutine

基本用法

package main import ( "fmt" "time" ) func sayHello(name string) { for i := 0; i < 3; i++ { fmt.Printf("Hello, %s! (%d)\n", name, i) time.Sleep(100 * time.Millisecond) } } func main() { // 启动Goroutine go sayHello("World") go sayHello("Go") // 等待Goroutine完成 time.Sleep(500 * time.Millisecond) fmt.Println("Main done") }

WaitGroup

package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("All workers done") }

Channel

基本用法

package main import "fmt" func producer(ch chan<- int) { for i := 0; i < 5; i++ { ch <- i fmt.Printf("Sent: %d\n", i) } close(ch) } func consumer(ch <-chan int) { for num := range ch { fmt.Printf("Received: %d\n", num) } } func main() { ch := make(chan int) go producer(ch) consumer(ch) }

带缓冲的Channel

package main import "fmt" func main() { ch := make(chan int, 3) // 缓冲大小为3 ch <- 1 ch <- 2 ch <- 3 fmt.Println(<-ch) // 1 fmt.Println(<-ch) // 2 fmt.Println(<-ch) // 3 }

Select语句

package main import ( "fmt" "time" ) func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { time.Sleep(1 * time.Second) ch1 <- "from channel 1" }() go func() { time.Sleep(2 * time.Second) ch2 <- "from channel 2" }() for i := 0; i < 2; i++ { select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } } }

并发模式

Worker Pool

package main import ( "fmt" "sync" ) func worker(id int, jobs <-chan int, results chan<- int) { for job := range jobs { fmt.Printf("Worker %d processing job %d\n", id, job) results <- job * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) // 启动3个worker for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送9个任务 for j := 1; j <= 9; j++ { jobs <- j } close(jobs) // 收集结果 for r := 1; r <= 9; r++ { <-results } }

Fan-Out/Fan-In

package main import ( "fmt" "sync" ) func producer(nums []int) <-chan int { out := make(chan int) go func() { for _, n := range nums { out <- n } close(out) }() return out } func square(in <-chan int) <-chan int { out := make(chan int) go func() { for n := range in { out <- n * n } close(out) }() return out } func merge(cs ...<-chan int) <-chan int { var wg sync.WaitGroup out := make(chan int) output := func(c <-chan int) { for n := range c { out <- n } wg.Done() } wg.Add(len(cs)) for _, c := range cs { go output(c) } go func() { wg.Wait() close(out) }() return out } func main() { in := producer([]int{1, 2, 3, 4}) c1 := square(in) c2 := square(in) for n := range merge(c1, c2) { fmt.Println(n) } }

最佳实践

1. 避免数据竞争

// 使用Mutex保护共享数据 var mu sync.Mutex var count int func increment() { mu.Lock() count++ mu.Unlock() }

2. 使用Context取消

package main import ( "context" "fmt" "time" ) func worker(ctx context.Context) { for { select { case <-ctx.Done(): fmt.Println("Worker cancelled") return default: fmt.Println("Working...") time.Sleep(100 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) go worker(ctx) time.Sleep(500 * time.Millisecond) cancel() time.Sleep(200 * time.Millisecond) }

总结

Go语言提供了出色的并发支持。通过Goroutine、Channel和Select,可以构建高效的并发应用。

我的鬃狮蜥Hash对并发也有自己的理解——它总是能同时关注多个方向的蟋蟀,这也许就是自然界的"并发编程"吧!

如果你对Go并发编程有任何问题,欢迎留言交流!我是欧阳瑞,极客之路,永无止境!


技术栈:Go语言 · 并发编程 · Goroutine

http://www.gsyq.cn/news/1399619.html

相关文章:

  • 【OpenCV零基础保姆级入门】一篇吃透计算机视觉预处理!全套实战代码,适配YOLO/深度学习
  • 别再被‘Could not open a connection to your authentication agent’卡住了!手把手教你启动SSH-Agent并添加密钥
  • 从调用链到关系图:多智能体系统故障建模与图算法分析实践
  • Python实现GPU温度精准监控:绕过系统层误差,直连硬件传感器
  • 别再死记硬背了!用Wireshark抓包实战,5分钟搞懂H264/H265的RTP打包与NALU结构
  • 大模型 B 端落地第一战场——财务 AI 的核心逻辑、落地方法与未来架构
  • 论三生原理:一部融贯数理星象的当代东方创世史诗?
  • 别再只盯着GNN了!用Python实战传统图特征:节点中心性、链接预测与图核方法
  • 大模型AI校招核心考点解析:从Transformer到工程实践,助你拿下Offer!
  • 2026年评价高的上海空气除菌过滤器/反冲洗过滤器/双联过滤器公司哪家好 - 行业平台推荐
  • Biomarker Res(IF=11.5)安徽医科大学第一医院:基于机器学习的放射组学模型:子宫内膜癌患者的预后预测及机制探索
  • OpenGL ES 4x MSAA实战:在Android/iOS上开启抗锯齿,性能开销真的像传说中那么小吗?
  • Cortex-M栈内存配置与地址获取实战指南
  • 山东交通设施哪家强?业内公认:山东伟通集团,全国 16 厂源头大厂
  • TwinCAT ADS通讯避坑指南:C#读写PLC结构体、数组时,字节对齐和类型映射那些事儿
  • AI智能体工程化:构建可靠智能系统的四大支柱与实战指南
  • 走进 GEO 新时代:详解中立监测平台搜极星的核心能力
  • 解读民法典自然人 民事权利能力和民事行为能力 第十五条
  • AI 技术在招投标文档编制中的应用与实践
  • 储能技术资料
  • 从日志到可观测性:开发者如何利用三大支柱定位分布式系统疑难问题
  • 从门店到全域,从赋能到增长:汇源集团如何搭建全域矩阵营销体系
  • 并发、并行与异步:核心概念辨析与工程实践指南
  • Keil C51链接错误L121解析与8051内存优化
  • 2026年口碑好的贵州冠晶石/贵州雅晶石/贵州水包砂优质供应商推荐 - 行业平台推荐
  • 游戏手柄+AI编程:用Wispr Flow打造免提式代码生成工作流
  • 2026年靠谱的上海前置过滤器/篮式过滤器批量采购厂家推荐 - 品牌宣传支持者
  • Unity游戏开发:用Dotween实现材质透明度动画的暂停、倒放与精准控制(附完整代码)
  • Keil µVision静态库创建与优化实战指南
  • 量子材料表征的物理信息学习框架与合成数据技术