introduction
首先,让我们来理解一下 goroutine。Goroutine 是一种轻量级的线程,由 Go 运行时环境管理。在 Go 语言中,你可以通过关键字 go 来启动一个新的 goroutine,而不需要手动创建线程。这意味着你可以很容易地并发地执行多个任务,而不必担心线程管理的复杂性。
其次,Go 语言还引入了 channel 的概念,用于在不同的 goroutine 之间进行通信和数据交换。Channel 可以被用来发送和接收数值,这样不同的 goroutine 就可以安全地共享数据,而无需担心竞态条件和锁的问题。
通过使用 goroutine 和 channel,你可以很方便地编写并发程序,实现并行执行任务、协作处理数据等操作。这种并发模型使得 Go 语言在处理大规模并发任务时表现出色,并且相对容易理解和维护。
concurrent
- goroutine
- channel
- select
- sync
- atomic
- context
- sync/atomic
- sync/pool
- sync/waitgroup
- sync/map
- sync/once
- sync/cond
- sync/
安全并发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| package main
import (
"fmt"
"sync"
"time"
)
func main() {
var cond sync.Cond
var wg sync.WaitGroup
wg.Add(2)
// 初始化 sync.Cond
cond = *sync.NewCond(&sync.Mutex{})
go func() {
defer wg.Done()
// 等待条件变量
cond.L.Lock()
cond.Wait()
cond.L.Unlock()
fmt.Println("Goroutine 1: Condition received")
}()
go func() {
defer wg.Done()
time.Sleep(2 * time.Second)
// 发送信号通知其他协程
cond.L.Lock()
cond.Signal()
cond.L.Unlock()
fmt.Println("Goroutine 2: Condition sent")
}()
wg.Wait()
}
|