go 中的协程是一種輕量級執行緒,可透過 goroutine 並發執行程式碼,提供以下優勢:輕量級且易於管理高並發的天然支援可避免鎖的死鎖和性能損耗go 透過以下模型實作協程運算:通道(channel):用於協程間通訊,避免數據競爭。共享記憶體:使用原子操作確保數據一致性。鎖:傳統協程原語,保護共享數據訪問。 copyright zvvq
本文来自zvvq
Go 协程与并发模型详解 copyright zvvq
协程基础
协程是轻量级的线程,与 goroutine 概念类似,由 Go 语言的运行时调度器管理。它允许在单个进程中并发执行代码,提高应用程序性能。 内容来自samhan
zvvq
协程的优势
创建协程
本文来自zvvq
使用 go 关键字创建协程:
内容来自samhan
1 copyright zvvq
2
内容来自zvvq,别采集哟
3 copyright zvvq
4
内容来自zvvq,别采集哟
5 本文来自zvvq
func main() {
zvvq好,好zvvq
go func() {
fmt.Println("Hello from a goroutine") 内容来自samhan666
}() 内容来自zvvq
} 内容来自samhan666
并发模型
内容来自zvvq,别采集哟
Go 语言提供了以下几种并发模型:
内容来自samhan
基于通道(channel): 用于协程之间通信,避免共享内存导致的数据竞争。共享内存: 使用原子操作(sync/atomic 包)操作共享变量,确保数据一致性。锁: 传统的并发原语,用于保护共享数据访问。实战案例
内容来自zvvq
使用通道进行并发计算: zvvq.cn
1
zvvq.cn
2 内容来自zvvq
3
4 内容来自zvvq,别采集哟
5
6
copyright zvvq
7 内容来自samhan
8 内容来自samhan
9 zvvq好,好zvvq
10 copyright zvvq
11 本文来自zvvq
12
zvvq好,好zvvq
func main() { 内容来自zvvq
ch := make(chan int)
for i := 0; i < 10; i++ { zvvq
go func(i int) {
ch <- i i
内容来自zvvq,别采集哟
}(i)
copyright zvvq
} 本文来自zvvq
for i := 0; i < 10; i++ {
fmt.Println(<-ch) 内容来自samhan
} zvvq好,好zvvq
}
copyright zvvq
使用 goroutine 池进行并发任务:
内容来自zvvq
1 zvvq好,好zvvq
2 zvvq.cn
3
zvvq好,好zvvq
4
5
zvvq.cn
6 内容来自zvvq
7
8 内容来自samhan666
9
内容来自samhan666
10 内容来自zvvq,别采集哟
11
内容来自samhan666
12
13 本文来自zvvq
14
15
内容来自zvvq,别采集哟
16
17 zvvq.cn
18 zvvq好,好zvvq
19
20
本文来自zvvq
21 内容来自samhan666
22
23 本文来自zvvq
24 本文来自zvvq
25 zvvq.cn
26
27 zvvq好,好zvvq
28 zvvq好,好zvvq
29
zvvq.cn
30
内容来自samhan
31 内容来自samhan
32 zvvq.cn
33 zvvq
34 内容来自samhan
35
copyright zvvq
36 zvvq好,好zvvq
37
本文来自zvvq
38 内容来自zvvq,别采集哟
39
40 内容来自samhan
41
zvvq.cn
42 zvvq好,好zvvq
43
内容来自zvvq,别采集哟
44
zvvq.cn
45 本文来自zvvq
46
47 本文来自zvvq
48 本文来自zvvq
package main copyright zvvq
import ( zvvq好,好zvvq
"context" zvvq好,好zvvq
"fmt"
"sync"
"time" zvvq
)
func main() { zvvq.cn
const numTasks = 100
内容来自zvvq,别采集哟
// 创建 goroutine 池
pool := make(chan func(), numTasks) 内容来自zvvq
for i := 0; i < numTasks; i++ { 内容来自zvvq
go func(i int) { 内容来自samhan666
// 从池中获取任务 zvvq.cn
task := <-pool 内容来自samhan666
// 执行任务 zvvq
time.Sleep(time.Second) copyright zvvq
fmt.Printf("Task %d completed\n", i) zvvq好,好zvvq
// 将任务放回池中 zvvq.cn
pool <- task
}(i)
} 内容来自zvvq,别采集哟
// 创建任务并将其放入池中
ctx := context.Background()
zvvq
for i := 0; i < numTasks; i++ {
zvvq
pool <- func() {
zvvq
fmt.Printf("Task %d started\n", i)
zvvq好,好zvvq
}
}
// 等待任务完成
for i := 0; i < numTasks; i++ { 内容来自samhan
go func(i int) {
<-pool copyright zvvq
fmt.Printf("Task %d completed\n", i)
本文来自zvvq
}(i)
zvvq.cn
}
// 等待所有任务完成
copyright zvvq
time.Sleep(5 time.Second) zvvq好,好zvvq
} 内容来自zvvq,别采集哟
使用 Mutex 进行并发共享内存: 内容来自samhan666
1 内容来自samhan
2 本文来自zvvq
3 本文来自zvvq
4
内容来自samhan666
5
zvvq好,好zvvq
6 zvvq.cn
7 copyright zvvq
8
9
10 zvvq.cn
11 zvvq.cn
12
zvvq
13 copyright zvvq
14
15
16 内容来自samhan
17
本文来自zvvq
18 zvvq
19 zvvq.cn
20 zvvq好,好zvvq
21
22
zvvq好,好zvvq
23 内容来自zvvq
package main
内容来自samhan666
import (
"fmt" 内容来自samhan
"sync" 内容来自samhan666
)
func main() { copyright zvvq
var count int 内容来自samhan
var mu sync.Mutex
for i := 0; i < 1000; i++ {
内容来自samhan666
go func(i int) {
本文来自zvvq
mu.Lock() zvvq好,好zvvq
count++ 本文来自zvvq
time.Sleep(time.Millisecond) copyright zvvq
mu.Unlock() zvvq.cn
}(i)
内容来自zvvq,别采集哟
}
time.Sleep(time.Second)
copyright zvvq
fmt.Println(count) // 打印 1000 zvvq好,好zvvq
} 本文来自zvvq
以上就是golang协程与并发模型详解的详细内容,更多请关注其它相关文章! zvvq好,好zvvq