zvvq技术分享网

Golang 中并发模式的全面比较?(golang高并发底层

作者:zvvq博客网
导读对于 go 语言中的并发模式,本文介绍了 goroutine、锁、通道、互斥量、条件变量和原子的优点和缺点。其中,goroutine 适合创建轻量级并发任务,但资源消耗较大;锁可保证同步但可能导

对于 go 语言中的并发模式,本文介绍了 goroutine、锁、通道、互斥量、条件变量和原子的优点和缺点。其中,goroutine 适合创建轻量级并发任务,但资源消耗较大;锁可保证同步但可能导致死锁;通道实现安全通信但需显式传递数据;互斥量性能较高但可能造成饥饿;条件变量同步机制灵活但可能导致优先级反转;原子可保证原子性但范围有限。实战案例展示了 goroutine 并发执行任务、锁同步共享资源访问以及通道用于并发任务通信。

copyright zvvq

本文来自zvvq

Golang 中并发模式的全面比较

并发是在现代计算机系统中处理多个任务的必要措施,Go 语言提供了多种并发模式来满足不同的需求。本文将对 Go 中主要的并发模式进行全面比较,重点关注它们的优点和缺点,并附有实战案例。 zvvq

并发模式

Go 语言支持以下主要的并发模式: zvvq好,好zvvq

goroutine (GO): 一种轻量级的线程,可用于并行执行代码。 锁: 一种同步机制,可确保对共享资源的独占访问。 通道: 一种通信机制,用于在并发例程之间交换值。 互斥量: 一种类型的锁,一次只能允许一个例程访问资源。 条件变量: 一种高级同步机制,允许例程等待特定条件满足后再继续执行。 原子: 一种变量,确保对它的读写操作是原子性的,即不可中断的。

优点和缺点

并发模式 优点 缺点 goroutine 创建轻量级 资源消耗较大 锁 保证同步 可能导致死锁 通道 实现安全通信 要求显式数据传递 互斥量 实现更高性能的同步 可能会导致饥饿 条件变量 灵活的同步机制 可能导致优先级反转 原子 保证原子性 范围有限

实战案例

goroutine 并发执行任务

1

zvvq

2 内容来自zvvq,别采集哟

3 内容来自samhan

4

zvvq好,好zvvq

5 内容来自zvvq

6 copyright zvvq

7 内容来自samhan666

8 内容来自zvvq,别采集哟

9 zvvq好,好zvvq

10

zvvq.cn

11

内容来自samhan

12

内容来自zvvq,别采集哟

13 zvvq好,好zvvq

14

内容来自zvvq

15

内容来自zvvq,别采集哟

16 zvvq

17

zvvq好,好zvvq

18 本文来自zvvq

19

zvvq.cn

20 内容来自zvvq

21 zvvq.cn

22 本文来自zvvq

23 zvvq.cn

24

zvvq好,好zvvq

package main

zvvq

import (

copyright zvvq

"fmt" zvvq.cn

"sync"

copyright zvvq

)

内容来自samhan666

func main() {

内容来自samhan

var wg sync.WaitGroup 内容来自zvvq,别采集哟

wg.Add(2) // 添加两个 goroutine

zvvq

// 创建两个 goroutine

内容来自zvvq,别采集哟

go func() { zvvq

fmt.Println("Goroutine 1 started")

copyright zvvq

wg.Done() // 任务完成,计数器减 1 本文来自zvvq

}()

zvvq.cn

go func() {

zvvq好,好zvvq

fmt.Println("Goroutine 2 started")

zvvq.cn

wg.Done() // 任务完成,计数器减 1

copyright zvvq

}() 内容来自zvvq

wg.Wait() // 等待所有 goroutine 完成 zvvq

}

本文来自zvvq

锁保证共享资源同步访问

1

zvvq好,好zvvq

2

内容来自zvvq

3 内容来自zvvq,别采集哟

4 本文来自zvvq

5

zvvq.cn

6

内容来自zvvq,别采集哟

7 zvvq好,好zvvq

8 zvvq.cn

9

本文来自zvvq

10

内容来自samhan

11

内容来自zvvq,别采集哟

12 copyright zvvq

13 copyright zvvq

14

zvvq好,好zvvq

15

内容来自zvvq,别采集哟

16 内容来自zvvq

17

本文来自zvvq

18 内容来自samhan

19 zvvq.cn

20 内容来自zvvq,别采集哟

21

zvvq好,好zvvq

22 内容来自samhan666

23

zvvq.cn

24

内容来自zvvq,别采集哟

25

内容来自zvvq,别采集哟

26

copyright zvvq

27

copyright zvvq

28

本文来自zvvq

29

zvvq.cn

30

zvvq好,好zvvq

31 内容来自samhan

package main

zvvq.cn

import ( 内容来自samhan666

"fmt" copyright zvvq

"sync"

zvvq好,好zvvq

)

copyright zvvq

func main() {

内容来自zvvq

// 使用互斥量保证共享资源的同步访问

本文来自zvvq

var mu sync.Mutex

copyright zvvq

// 创建共享资源

zvvq

counter := 0 内容来自samhan

// 创建两个<a style=color:#f60; text-decoration:underline; href="https://www.php.cn/zt/35877.html" target="_blank">并发访问</a>共享资源的 goroutine 内容来自samhan

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

copyright zvvq

go func() {

zvvq

// 获取锁,确保对资源的独占访问

内容来自samhan666

mu.Lock() 内容来自samhan

// 对共享资源进行操作 zvvq好,好zvvq

counter++ 内容来自zvvq

// 释放锁,允许其他 goroutine 访问资源 zvvq.cn

mu.Unlock()

zvvq.cn

}() 内容来自zvvq,别采集哟

}

zvvq.cn

fmt.Println("Final counter value:", counter)

内容来自zvvq,别采集哟

}

zvvq好,好zvvq

通道用于并发任务间的通信

1 zvvq好,好zvvq

2 内容来自zvvq,别采集哟

3

zvvq.cn

4

内容来自samhan666

5

zvvq.cn

6

内容来自samhan666

7 内容来自samhan666

8 本文来自zvvq

9 内容来自samhan666

10 内容来自zvvq

11 内容来自zvvq,别采集哟

12 内容来自zvvq

13

copyright zvvq

14 zvvq

15

内容来自samhan666

16

内容来自zvvq,别采集哟

17

copyright zvvq

18 本文来自zvvq

19

zvvq好,好zvvq

20

内容来自zvvq,别采集哟

21 内容来自samhan

22 zvvq

23 内容来自samhan666

24 zvvq

25

内容来自zvvq,别采集哟

26

本文来自zvvq

27

zvvq

package main zvvq好,好zvvq

import ( 内容来自zvvq

"fmt" 内容来自samhan

"sync"

zvvq

"time" 内容来自zvvq,别采集哟

)

内容来自samhan666

func main() {

zvvq.cn

// 创建一个通道,用于传递消息

内容来自zvvq,别采集哟

ch := make(chan string) 内容来自samhan666

// 创建一个 goroutine 向通道发送消息 copyright zvvq

go func() {

zvvq

time.Sleep(time.Second)

zvvq.cn

ch <- "Hello from the goroutine"

内容来自samhan666

}() 内容来自samhan

// 创建一个 goroutine 从通道接收消息 内容来自zvvq

go func() {

本文来自zvvq

msg := <-ch 本文来自zvvq

fmt.Println(msg) 内容来自zvvq

}() 内容来自samhan666

fmt.Println("Waiting for messages") zvvq

time.Sleep(time.Second * 2)

copyright zvvq

} zvvq

以上就是Golang 中并发模式的全面比较?的详细内容,更多请关注其它相关文章! 内容来自zvvq,别采集哟