golang 学习笔记2

发布时间:2024-07-02 22:30:39

## Golang学习笔记2: 并发编程 并发编程是Go语言中的一大特点,它的并发模型是基于协程(goroutine)和通道(channel)的。本篇文章将介绍Golang中的并发编程,并探讨一些常用的并发处理模式。 ### 协程与通道 在Golang中,我们使用协程来实现轻量级的并发操作。协程是一种比线程更轻量级的并发单位,它由Golang运行时管理,并且可以根据需要自动扩展或收缩。协程的创建非常简单,只需在函数调用前添加`go`关键字即可。 ```go func doSomething() { // ... } func main() { go doSomething() // ... } ``` 上述代码中,`doSomething()`函数将在一个新的协程中运行,不会阻塞主程序的执行。协程之间可以通过通道进行通信,而通道则是Golang提供的一种数据结构,用于协程之间的安全数据传输。 ```go func produce(c chan<- int) { for i := 0; i < 10; i++ { c <- i } close(c) } func consume(c <-chan int) { for num := range c { fmt.Println(num) } } func main() { c := make(chan int) go produce(c) consume(c) } ``` 在上述代码中,我们创建了一个通道`c`,并将其作为参数传递给两个协程。`produce()`函数向通道发送数据,`consume()`函数从通道接收数据并打印。通过通道的阻塞操作,我们可以保证协程之间的同步与安全。 ### 并发处理模式 在实际开发中,我们经常需要处理一些并发的任务。下面介绍几种常用的并发处理模式。 #### 1. Worker Pool Worker Pool模式用于解决多个任务之间的负载均衡问题。该模式通过创建多个工作者(worker)协程并使用无缓冲通道来调度任务。 ```go func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { // 执行任务 results <- j * 2 } } func main() { numJobs := 10 numWorkers := 5 jobs := make(chan int, numJobs) results := make(chan int, numJobs) // 创建工作者协程 for i := 0; i < numWorkers; i++ { go worker(i, jobs, results) } // 添加任务到通道中 for i := 0; i < numJobs; i++ { jobs <- i } close(jobs) // 获取任务执行结果 for i := 0; i < numJobs; i++ { fmt.Println(<-results) } } ``` 上述代码中,我们创建了一个`jobs`通道和一个`results`通道,分别用于发送任务和接收任务结果。然后我们创建多个工作者协程,并通过`jobs`通道接收任务。每个工作者协程会执行任务,并将结果发送到`results`通道中。最后,我们在主程序中从`results`通道中获取任务的执行结果。 #### 2. 单例模式 并发环境中,我们通常需要确保某个对象的唯一性。Golang中可以通过使用`sync.Once`来实现单例模式。 ```go type Singleton struct { // ... } var instance *Singleton var once sync.Once func getInstance() *Singleton { once.Do(func() { instance = &Singleton{} }) return instance } ``` 在上述代码中,我们创建了一个`Singleton`结构体,通过调用`getInstance()`函数获取该结构体的唯一实例。通过使用`sync.Once`的`Do()`方法,我们可以确保`instance`变量只会被初始化一次。这样,在多个协程同时调用`getInstance()`函数时,也能保证只创建一个实例。 ### 总结 本篇文章介绍了Golang中的并发编程,并探讨了协程和通道的使用方式。同时,我们还介绍了两种常见的并发处理模式:Worker Pool模式和单例模式。并发编程是Golang的一大特点,合理地运用并发模型可以提高程序的性能和可伸缩性。希望本文能为读者在并发编程方面提供一些启示和帮助。

相关推荐