Go语言中如何避免数据竞争模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计4604个文字,预计阅读时间需要19分钟。
原文:本文字主要基于在Uber的Go monorepo中发现的各类数据竞赛模式,分析了其背后的原因与分类,希望能够帮助更多的Go开发人员去关注并改进代码编写,考虑不同语言的特性以及避免由语言特性引起的错误。
改写后:本文探讨了Uber Go monorepo中的多种数据竞赛模式,分析了其成因与分类,旨在助力Go开发者关注代码优化,关注不同语言特性,并避免由语言特性引发的错误。
本文主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其背后的原因与分类,希望能够帮助更多的Go开发人员,去关注并发代码的编写,考虑不同的语言的特性、以及避免由于自身编程习惯所引发的并发错误。
近年来,Uber已经开始采用Golang(简称Go)作为开发微服务的主要编程语言。目前,其Go monorepo(译者注:包含多个不同项目的单个仓库)包含了大约5,000万行代码,以及大约2,100个独特的Go服务。而且,它们都还在持续增长中。
为了实现并发,我们通常会使用go关键字,为函数调用添加前缀,以实现异步式的运行调用。在Go中,此类异步函数调用被称为goroutine。开发人员可以通过创建goroutine(例如,对其他服务的IO或RPC调用),来隐藏延迟。不同的goroutine可以通过消息传递,以及共享内存的方式,来传递数据。其中,共享内存恰好是Go中最常用的数据通信方式之一。
由于goroutineGo很容易被程序员创建和使用,因此它被认为属于“轻量级” 。同时,由Go编写的程序通常会比由其他语言编写的程序具有更强的并发性。例如,通过扫描数十万个运行在数据中心的微服务实例,我们发现Go微服务的并发性可达Java微服务的8倍。
当然,更高的并发性也意味着更多潜在的并发错误。
本文共计4604个文字,预计阅读时间需要19分钟。
原文:本文字主要基于在Uber的Go monorepo中发现的各类数据竞赛模式,分析了其背后的原因与分类,希望能够帮助更多的Go开发人员去关注并改进代码编写,考虑不同语言的特性以及避免由语言特性引起的错误。
改写后:本文探讨了Uber Go monorepo中的多种数据竞赛模式,分析了其成因与分类,旨在助力Go开发者关注代码优化,关注不同语言特性,并避免由语言特性引发的错误。
本文主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其背后的原因与分类,希望能够帮助更多的Go开发人员,去关注并发代码的编写,考虑不同的语言的特性、以及避免由于自身编程习惯所引发的并发错误。
近年来,Uber已经开始采用Golang(简称Go)作为开发微服务的主要编程语言。目前,其Go monorepo(译者注:包含多个不同项目的单个仓库)包含了大约5,000万行代码,以及大约2,100个独特的Go服务。而且,它们都还在持续增长中。
为了实现并发,我们通常会使用go关键字,为函数调用添加前缀,以实现异步式的运行调用。在Go中,此类异步函数调用被称为goroutine。开发人员可以通过创建goroutine(例如,对其他服务的IO或RPC调用),来隐藏延迟。不同的goroutine可以通过消息传递,以及共享内存的方式,来传递数据。其中,共享内存恰好是Go中最常用的数据通信方式之一。
由于goroutineGo很容易被程序员创建和使用,因此它被认为属于“轻量级” 。同时,由Go编写的程序通常会比由其他语言编写的程序具有更强的并发性。例如,通过扫描数十万个运行在数据中心的微服务实例,我们发现Go微服务的并发性可达Java微服务的8倍。
当然,更高的并发性也意味着更多潜在的并发错误。

