Go语言中实现函数并行执行并安全获取返回值的完整教程

12次阅读

Go语言中实现函数并行执行并安全获取返回值的完整教程

通过 goroutine 和 channel 可以让两个耗时函数(如 f1(2) 和 f1(1))并发执行,使总耗时由 3 秒降至最长子任务耗时(2 秒),无需修改原函数签名,仅需在调用侧引入并发机制。

go 中,函数默认是顺序执行的:runNotParallel() 先阻塞等待 f1(2) 完成(2 秒),再阻塞等待 f1(1)(1 秒),总计耗时 3 秒。要实现真正的并行执行,核心思路是将函数调用“卸载”到独立 goroutine 中,并通过 channel 同步收集结果

关键点在于:

  • 无需重写 f1:它保持纯函数、无副作用、签名不变,完全兼容并发调用;
  • 使用无缓冲 channel 作为同步信道:chan String 既传递结果,又天然实现“等待完成”的语义;
  • goroutine 启动即执行:go func() { out1
  • 主 goroutine 阻塞在 :这确保 f2 仅在两个结果都就绪后才被调用,逻辑正确性不受影响。

以下是优化后的 runParallel 实现:

func runParallel() { out1 := make(chan string) out2 := make(chan string) go func() { out1 <- f1(2) }() go func() { out2 <- f1(1)>

⚠️ 注意事项:

立即学习go语言免费学习笔记(深入)”;

  • 若 f1 内部有共享状态或非线程安全操作(如操作全局变量、未加锁的 map),需额外同步;本例中 f1 是纯函数,完全安全。
  • channel 类型需与返回值严格匹配(如 string),避免类型错误。
  • 不建议省略 channel 变量声明直接写 go func(c chan

✅ 总结:Go 的并发模型强调“通过通信共享内存”,用 goroutine + channel 组合替代传统回调或 Future/promise,简洁、安全、符合 Go 的哲学。只需三步即可改造串行调用为并行:声明 channel → 启动 goroutine 写入 → 主流程读取并消费。这是 Go 并发编程最典型、最推荐的实践模式。

text=ZqhQzanResources