ZVVQ代理分享网

golang协程与并发模型详解(golang的并发模型)

作者:zvvq博客网
导读go 中的协程是一種輕量級執行緒,可透過 goroutine 並發執行程式碼,提供以下優勢:輕量級且易於管理高並發的天然支援可避免鎖的死鎖和性能損耗go 透過以下模型實作協程運算:通道

go 中的协程是一種輕量級執行緒,可透過 goroutine 並發執行程式碼,提供以下優勢:輕量級且易於管理高並發的天然支援可避免鎖的死鎖和性能損耗go 透過以下模型實作協程運算:通道(channel):用於協程間通訊,避免數據競爭。共享記憶體:使用原子操作確保數據一致性。鎖:傳統協程原語,保護共享數據訪問。 copyright zvvq

本文来自zvvq

Go 协程与并发模型详解 copyright zvvq

协程基础

内容来自zvvq

协程是轻量级的线程,与 goroutine 概念类似,由 Go 语言的运行时调度器管理。它允许在单个进程中并发执行代码,提高应用程序性能。 内容来自samhan

”;

zvvq

协程的优势

zvvq

轻量级且易于管理 高并发的天然支持 可避免锁带来的死锁和性能损耗

创建协程

本文来自zvvq

使用 go 关键字创建协程:

内容来自samhan

1 copyright zvvq

2

内容来自zvvq,别采集哟

3 copyright zvvq

4

内容来自zvvq,别采集哟

5 本文来自zvvq

func main() {

zvvq好,好zvvq

go func() {

内容来自zvvq

fmt.Println("Hello from a goroutine") 内容来自samhan666

}() 内容来自zvvq

} 内容来自samhan666

并发模型

内容来自zvvq,别采集哟

Go 语言提供了以下几种并发模型:

内容来自samhan

基于通道(channel): 用于协程之间通信,避免共享内存导致的数据竞争。共享内存: 使用原子操作(sync/atomic 包)操作共享变量,确保数据一致性。锁: 传统的并发原语,用于保护共享数据访问

实战案例

内容来自zvvq

使用通道进行并发计算: zvvq.cn

1

zvvq.cn

2 内容来自zvvq

3

本文来自zvvq

4 内容来自zvvq,别采集哟

5

zvvq.cn

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)

内容来自zvvq

for i := 0; i < 10; i++ { zvvq

go func(i int) {

zvvq好,好zvvq

ch <- i i

内容来自zvvq,别采集哟

}(i)

copyright zvvq

} 本文来自zvvq

for i := 0; i < 10; i++ {

copyright zvvq

fmt.Println(<-ch) 内容来自samhan

} zvvq好,好zvvq

}

copyright zvvq

使用 goroutine 池进行并发任务:

内容来自zvvq

1 zvvq好,好zvvq

2 zvvq.cn

3

zvvq好,好zvvq

4

zvvq.cn

5

zvvq.cn

6 内容来自zvvq

7

内容来自samhan

8 内容来自samhan666

9

内容来自samhan666

10 内容来自zvvq,别采集哟

11

内容来自samhan666

12

内容来自samhan

13 本文来自zvvq

14

内容来自samhan666

15

内容来自zvvq,别采集哟

16

copyright zvvq

17 zvvq.cn

18 zvvq好,好zvvq

19

内容来自samhan666

20

本文来自zvvq

21 内容来自samhan666

22

copyright zvvq

23 本文来自zvvq

24 本文来自zvvq

25 zvvq.cn

26

内容来自zvvq,别采集哟

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

本文来自zvvq

40 内容来自samhan

41

zvvq.cn

42 zvvq好,好zvvq

43

内容来自zvvq,别采集哟

44

zvvq.cn

45 本文来自zvvq

46

内容来自zvvq,别采集哟

47 本文来自zvvq

48 本文来自zvvq

package main copyright zvvq

import ( zvvq好,好zvvq

"context" zvvq好,好zvvq

"fmt"

内容来自zvvq

"sync"

内容来自zvvq

"time" zvvq

)

内容来自samhan666

func main() { zvvq.cn

const numTasks = 100

内容来自zvvq,别采集哟

// 创建 goroutine 池

zvvq.cn

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

zvvq.cn

}(i)

内容来自zvvq

} 内容来自zvvq,别采集哟

// 创建任务并将其放入池中

zvvq

ctx := context.Background()

zvvq

for i := 0; i < numTasks; i++ {

zvvq

pool <- func() {

zvvq

fmt.Printf("Task %d started\n", i)

zvvq好,好zvvq

}

zvvq好,好zvvq

}

内容来自zvvq,别采集哟

// 等待任务完成

内容来自samhan666

for i := 0; i < numTasks; i++ { 内容来自samhan

go func(i int) {

zvvq好,好zvvq

<-pool copyright zvvq

fmt.Printf("Task %d completed\n", i)

本文来自zvvq

}(i)

zvvq.cn

}

内容来自samhan666

// 等待所有任务完成

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

zvvq好,好zvvq

9

zvvq好,好zvvq

10 zvvq.cn

11 zvvq.cn

12

zvvq

13 copyright zvvq

14

内容来自samhan666

15

zvvq.cn

16 内容来自samhan

17

本文来自zvvq

18 zvvq

19 zvvq.cn

20 zvvq好,好zvvq

21

zvvq好,好zvvq

22

zvvq好,好zvvq

23 内容来自zvvq

package main

内容来自samhan666

import (

copyright zvvq

"fmt" 内容来自samhan

"sync" 内容来自samhan666

)

zvvq

func main() { copyright zvvq

var count int 内容来自samhan

var mu sync.Mutex

内容来自zvvq,别采集哟

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,别采集哟

}

内容来自samhan666

time.Sleep(time.Second)

copyright zvvq

fmt.Println(count) // 打印 1000 zvvq好,好zvvq

} 本文来自zvvq

以上就是golang协程与并发模型详解的详细内容,更多请关注其它相关文章! zvvq好,好zvvq