写点什么

Go 高级并发模式

作者:俞凡
  • 2023-12-23
    上海
  • 本文字数:1452 字

    阅读完需:约 5 分钟

Go 对并发提供了强大的原生支持,本文讨论 Go 的高级并发模式,理解这些并发模式,可以帮助我们编写高效的 Go 应用程序。原文: Advanced Concurrency Patterns in Go



"并发不是并行,但使并行成为可能。" —— Rob Pike


本文将深入探讨 Go 中的一些高级并发模式。Go 以其内置的并发原语而闻名,理解这些模式可以帮助我们编写更高效、可扩展的应用程序。



1. 基础 Goroutine

goroutine 是由 Go 运行时管理的轻量级线程。要启动一个 goroutine,只需在函数前使用go关键字。


package main
import ( "fmt" "time")
func sayHello() { fmt.Println("Hello from a goroutine!")}
func main() { go sayHello() // This starts a new goroutine. time.Sleep(1 * time.Second) // Give goroutine some time to execute.}
复制代码


在本例中,sayHello函数与main函数并发运行。



2. Channel 和 Select

channel 用于在程序之间进行通信,同步执行并确保数据安全。


基础 channel 示例


package main
import "fmt"
func main() { message := make(chan string) // create a new channel
go func() { // start a goroutine message <- "Hello from the other side!" // send a message to the channel }()
msg := <-message // receive a message from the channel fmt.Println(msg)}
复制代码


我们可以通过 channel 安全的在例程之间发送和接收消息。


使用 Select


select允许程序等待多个通信操作,它就像一个针对 channel 的 switch 语句。


package main
import ( "fmt" "time")
func main() { ch1 := make(chan string) ch2 := make(chan string)
go func() { for { ch1 <- "from ch1" time.Sleep(2 * time.Second) } }()
go func() { for { ch2 <- "from ch2" time.Sleep(3 * time.Second) } }()
go func() { for { select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } } }()
select {} // keep the main function alive}
复制代码


基于select,我们可以同时处理多个 channel。



3. 高级模式: 工作池(Worker Pool)

工作池是一种限制运行的 goroutine 数量的方法。


工作池示例


package main
import ( "fmt" "time")
func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "processing job", j) time.Sleep(time.Second) results <- j * 2 }}
func main() { const numJobs = 5 jobs := make(chan int, numJobs) results := make(chan int, numJobs)
// start 3 workers for w := 1; w <= 3; w++ { go worker(w, jobs, results) }
// send jobs for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs)
// collect results for a := 1; a <= numJobs; a++ { <-results }}
复制代码


工作池帮助我们管理和限制并发运行的 goroutine 数量。



结论

Go 中的并发(goroutine、channel 和模式)为开发人员提供了强大的工具集。通过理解和利用这些概念,可以构建高性能和可伸缩的应用程序。




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 5
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
Go高级并发模式_golang_俞凡_InfoQ写作社区