当前位置: 首页 > 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.jsqmd.com/news/894894/

相关文章:

  • 告别变砖!NRF52832串口DFU升级实战:从Bootloader配置到Secure DFU签名全流程避坑
  • C#正课二十一(单例模式)
  • Claude Code 最常用斜杠命令
  • AI写的毕业论文初稿双率超标?怎么选靠谱的降重降AI工具
  • 规格驱动开发:用Warp/Oz构建可复现的机器学习工作流
  • Python实现GPU温度精准监控:绕过系统层误差,直连硬件传感器
  • Android性能分析深度指南:Perfetto工具全面解析
  • 大模型 B 端落地第一战场——财务 AI 的核心逻辑、落地方法与未来架构
  • 多队列SSD与LSM树性能优化实践
  • Java基于Spring Boot+Vue的养老院管理系统的设计与实现
  • 突破尺度困境:10 米以上高挑空展陈的全维度设计思路
  • 开发一个淘宝客APP需要多少钱?
  • 论三生原理:一部融贯数理星象的当代东方创世史诗?
  • Biomarker Res(IF=11.5)安徽医科大学第一医院:基于机器学习的放射组学模型:子宫内膜癌患者的预后预测及机制探索
  • Prometheus 拿短时任务没办法?试过才知道这个坑有多深
  • Gemini 3.5 发布:AI 大模型竞争进入“Agent 优先“新阶段
  • Cortex-M栈内存配置与地址获取实战指南
  • 2026年评价高的上海空气除菌过滤器/反冲洗过滤器/双联过滤器公司哪家好 - 行业平台推荐
  • OpenGL ES 4x MSAA实战:在Android/iOS上开启抗锯齿,性能开销真的像传说中那么小吗?
  • Charles抓包工具在Android开发中的深度应用与网络调试实践
  • TwinCAT ADS通讯避坑指南:C#读写PLC结构体、数组时,字节对齐和类型映射那些事儿
  • 2026年靠谱的上海夹套过滤器/钛棒过滤器/磁性过滤器厂家精选合集 - 品牌宣传支持者
  • AI智能体工程化:构建可靠智能系统的四大支柱与实战指南
  • 基于Whisper与Llama 3的离线语音AI编程助手实现指南
  • MySQL基础篇:SQL语法、约束、多表查询、事务...
  • Android开发中的Git、GitLab与代码评审实践
  • 多智能体共识机制全解析:从Paxos到区块链的工程选型指南
  • Astribot Suite:机器人全身协调控制技术解析
  • 2610.摆脱批量出图繁琐操作!豆包超能模式从底层逻辑解决创作效率痛点
  • 《重构:改善既有代码的设计》阅读笔记