返回

并发Go-Go-Go!Go语言并发编程入门

后端

并发编程和 Go 语言:开启多核处理器的强大功能

并发编程简介

并发编程是一种编程范式,允许程序同时执行多个任务。在当今世界中,多核 CPU 已成为常态,并发编程至关重要,因为它可以充分利用这些处理器的计算能力。

Go 语言的并发编程模型

Go 语言通过其基于 CSP(通信顺序进程)模型的并发编程模型脱颖而出。该模型采用通过消息传递进行通信的理念,而不是共享内存。这种设计使并发程序更容易设计和推理,并避免了常见的并发问题,如死锁和数据竞争。

Goroutine:轻量级并发性

Goroutine 是 Go 语言并发编程的基础。它是一种轻量级线程,与传统线程相比,创建和调度成本更低。一个 goroutine 可以独立运行或与其他 goroutine 交互。使用 go 可以创建 goroutine,如下所示:

go func() {
  fmt.Println("Hello, world!")
}()

Channel:Goroutine 之间的通信管道

Channel 是 Goroutine 之间通信的管道。它允许在 goroutine 之间传输数据和信号。使用 make 函数可以创建 channel,如下所示:

ch := make(chan int)

Goroutine 可以通过发送和接收操作与 channel 交互:

ch <- 42

value := <-ch

Sync 包:同步 Goroutine

Sync 包提供了用于同步 goroutine 的工具,例如 Mutex、WaitGroup 和 Cond。

  • Mutex: 保护共享数据,防止并发访问导致的竞争条件。
  • WaitGroup: 用于等待一组 goroutine 完成。
  • Cond: 提供高级同步机制,允许 goroutine 等待特定条件。

代码示例:互斥访问共享数据

让我们看看如何使用 Mutex 保护共享变量:

var mu sync.Mutex
var counter int

func incrementCounter() {
  mu.Lock()
  defer mu.Unlock()

  counter++
}

代码示例:使用 WaitGroup 等待 Goroutine 完成

此代码段演示了如何使用 WaitGroup 等待 10 个 goroutine 完成:

var wg sync.WaitGroup

func worker(id int) {
  defer wg.Done()

  fmt.Println("Worker", id, "started")
  time.Sleep(1 * time.Second)
  fmt.Println("Worker", id, "finished")
}

func main() {
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go worker(i)
  }

  wg.Wait()
}

总结:Go 语言中的并发编程

Go 语言的并发编程模型旨在利用多核 CPU 的优势。Goroutine、channel 和 Sync 包共同提供了丰富的工具,使开发者能够编写高效、可维护的并发程序。CSP 模型通过强调通信而不是共享内存,简化了并发编程。

常见问题解答

1. 什么是 goroutine?

Goroutine 是 Go 语言中的一种轻量级线程,用于并发编程。

2. 如何创建 goroutine?

使用 go 关键字可以创建 goroutine。

3. 什么是 channel?

Channel 是 goroutine 之间通信的管道,允许传输数据和信号。

4. Sync 包有什么用?

Sync 包提供同步工具,例如 Mutex、WaitGroup 和 Cond,用于协调 goroutine 的执行。

5. Go 语言的并发编程模型有什么优势?

基于 CSP 模型,强调通过通信而不是共享内存进行并发,从而简化了编程并避免了常见的并发问题。