Go并发三板斧:掌握这些技巧,你的代码更高效

简介: Go并发三板斧:掌握这些技巧,你的代码更高效

Go并发三板斧:掌握这些技巧,你的代码更高效

Go语言凭借其原生并发支持成为后端开发的热门选择。但用好 goroutine 和 channel 并不简单。今天分享三个实用技巧,助你写出更健壮的并发代码。

一、用 sync.Once 确保单次执行

在并发环境中,某些初始化操作只需执行一次,比如配置加载。sync.Once 能保证无论多少 goroutine 调用,函数只执行一次。

var once sync.Once
var config *Config

func loadConfig() {
   
    config = load() // 假设 load 从文件或网络加载配置
}

func GetConfig() *Config {
   
    once.Do(loadConfig)
    return config
}

无论多少个 goroutine 同时调用 GetConfigloadConfig 都只运行一次,安全又高效。

二、使用 errgroup 管理协程

标准库的 sync.WaitGroup 只能等待,无法传递错误。golang.org/x/sync/errgroup 包弥补了这一缺陷。它允许你启动一组 goroutine,并等待所有完成或第一个错误返回。

import "golang.org/x/sync/errgroup"

g, ctx := errgroup.WithContext(context.Background())
for _, task := range tasks {
   
    task := task // 捕获迭代变量
    g.Go(func() error {
   
        return process(task) // process 可能返回错误
    })
}

if err := g.Wait(); err != nil {
   
    // 处理错误(可能是第一个返回的错误)
}

配合 ctx 还能在出错时自动取消其他 goroutine,非常实用。

三、channel 的关闭与广播

关闭 channel 可以同时通知多个接收者。利用这一特性实现优雅退出。创建一个 stop channel,所有 worker 监听,主程序关闭 channel 即可广播停止信号。

stop := make(chan struct{
   })
workers := 5

for i := 0; i < workers; i++ {
   
    go func() {
   
        for {
   
            select {
   
            case <-stop:
                return // 收到停止信号,退出
            default:
                // 正常工作
                doWork()
            }
        }
    }()
}

// 需要停止所有 worker 时
close(stop) // 广播停止信号,所有 worker 都会退出

这种方式无需维护 worker 列表,简洁且可靠。


掌握这些技巧,你的 Go 并发代码将更安全、更清晰。快去项目中试试吧!

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33252 201
如何保证分布式文件系统的数据一致性
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36823 22
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24905 16
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36824 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29949 52

热门文章

最新文章