zvvq技术分享网

golang并发编程中的管道与消息队列(go协程使用)

作者:zvvq博客网
导读管道和消息队列是 go 中用于 goroutine 通信的原语。管道是无缓冲通道,立即传递数据;消息队列是缓冲通道,允许存储多个消息。实战案例中,管道可用于并行处理任务,如将一组任务

管道和消息队列是 go 中用于 goroutine 通信的原语。管道是无缓冲通道,立即传递数据;消息队列是缓冲通道,允许存储多个消息。实战案例中,管道可用于并行处理任务,如将一组任务发送到管道并使用 goroutine 池并行处理。

内容来自zvvq

copyright zvvq

Go 中的管道与消息队列

copyright zvvq

在 Go 中,管道和消息队列是用于 goroutine 之间通信的两个基本原语。 内容来自zvvq

管道 zvvq

go语言免费”;

zvvq.cn

管道是无缓冲的通信通道,数据会立即从写入端传递到读取端。管道通常用于在 goroutine 之间传递小块数据。 内容来自zvvq,别采集哟

创建管道:

内容来自zvvq,别采集哟

1 zvvq

2 zvvq好,好zvvq

3

内容来自samhan

4

zvvq

5

内容来自samhan666

6 内容来自zvvq

7

内容来自zvvq

8

内容来自samhan

9

内容来自samhan666

10

zvvq

11

内容来自samhan

12 zvvq.cn

13

copyright zvvq

14

zvvq

15

本文来自zvvq

package main zvvq.cn

import "fmt" copyright zvvq

func main() {

zvvq.cn

// 创建一个管道

zvvq

ch := make(chan int) 内容来自zvvq

// 写入数据 zvvq.cn

ch <- 42

内容来自samhan

// 读取数据

内容来自zvvq

v := <-ch 本文来自zvvq

fmt.Println(v) // 输出 42 内容来自zvvq

} copyright zvvq

消息队列 本文来自zvvq

消息队列是一种缓冲的通信通道,允许在写入端和读取端之间存储多个消息。这使得 goroutine 可以按自己的节奏发送和接收消息,而不必担心丢失或阻塞。

zvvq

使用内置的 sync.Mutex 和 sync.Cond 创建一个简单的消息队列:

内容来自samhan666

1

内容来自samhan666

2

本文来自zvvq

3 本文来自zvvq

4 内容来自samhan

5 本文来自zvvq

6

zvvq好,好zvvq

7 zvvq好,好zvvq

8 本文来自zvvq

9

zvvq

10

zvvq.cn

11 zvvq

12 copyright zvvq

13 copyright zvvq

14

内容来自zvvq,别采集哟

15 zvvq好,好zvvq

16

zvvq

17

内容来自zvvq

18 内容来自zvvq,别采集哟

19 内容来自zvvq,别采集哟

20

zvvq

21 内容来自samhan666

22

本文来自zvvq

23

zvvq好,好zvvq

24 内容来自zvvq

25 内容来自zvvq

26

内容来自zvvq

27

本文来自zvvq

28 内容来自samhan

29 zvvq

30 zvvq好,好zvvq

31 内容来自samhan

32 内容来自zvvq,别采集哟

33

内容来自samhan

34

内容来自samhan666

35

本文来自zvvq

36 内容来自samhan666

37 内容来自samhan666

38 zvvq好,好zvvq

39 内容来自samhan

40 zvvq.cn

41 zvvq

42

内容来自zvvq,别采集哟

43 zvvq好,好zvvq

44

本文来自zvvq

package main zvvq

import ( copyright zvvq

"fmt" 内容来自zvvq

"sync"

zvvq.cn

"time"

内容来自zvvq

) copyright zvvq

func main() { zvvq

// 创建一个消息队列

zvvq

var ( copyright zvvq

queue = []int{}

内容来自zvvq

mu    sync.Mutex 内容来自samhan

cond  sync.Cond

内容来自zvvq

) zvvq

// 启动一个生产者 goroutine

本文来自zvvq

go func() {

本文来自zvvq

for { 本文来自zvvq

mu.Lock() 内容来自zvvq

queue = append(queue, 42)

内容来自zvvq

cond.Signal() zvvq好,好zvvq

mu.Unlock() zvvq.cn

time.Sleep(time.Second)

本文来自zvvq

}

内容来自zvvq,别采集哟

}() zvvq好,好zvvq

// 启动一个消费者 goroutine copyright zvvq

go func() {

zvvq好,好zvvq

for { copyright zvvq

mu.Lock()

本文来自zvvq

for len(queue) == 0 { copyright zvvq

cond.Wait() 本文来自zvvq

} zvvq.cn

v := queue[0] 内容来自zvvq,别采集哟

queue = queue[1:]

内容来自zvvq

mu.Unlock() 本文来自zvvq

fmt.Println(v) // 输出 42 zvvq

}

内容来自zvvq

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

// 等待 goroutine 退出 本文来自zvvq

time.Sleep(time.Second 5) 内容来自zvvq,别采集哟

} zvvq

实战案例:并行处理任务 本文来自zvvq

管道或消息队列可以用于并行处理任务。以下是一个示例,说明如何使用管道并行处理一组任务: copyright zvvq

1

zvvq.cn

2

zvvq

3 zvvq好,好zvvq

4 copyright zvvq

5 内容来自zvvq

6

zvvq好,好zvvq

7

zvvq好,好zvvq

8

copyright zvvq

9 zvvq好,好zvvq

10 zvvq好,好zvvq

11

zvvq.cn

12

内容来自zvvq

13

zvvq

14

本文来自zvvq

15

zvvq好,好zvvq

16

本文来自zvvq

17 内容来自zvvq

18

内容来自samhan666

19 本文来自zvvq

20 内容来自zvvq

21

本文来自zvvq

22 zvvq好,好zvvq

23 内容来自zvvq

24

copyright zvvq

25 内容来自samhan

26

zvvq.cn

27

内容来自samhan666

28

zvvq

29 copyright zvvq

30

内容来自samhan666

31

zvvq好,好zvvq

32 内容来自zvvq

33 zvvq.cn

34 内容来自zvvq,别采集哟

35 内容来自zvvq,别采集哟

36 zvvq

37

zvvq好,好zvvq

package main

本文来自zvvq

import ( 内容来自zvvq,别采集哟

"fmt"

内容来自zvvq

"sync" zvvq

)

zvvq.cn

func main() {

内容来自samhan

// 定义任务 copyright zvvq

tasks := []int{1, 2, 3, 4, 5} 内容来自zvvq

// 创建管道

zvvq好,好zvvq

ch := make(chan int)

zvvq

// 启动 goroutine 池来处理任务

内容来自zvvq,别采集哟

var wg sync.WaitGroup 内容来自samhan

for i := 0; i < 4; i++ { zvvq.cn

wg.Add(1)

内容来自zvvq

go func(ch chan int) {

内容来自samhan

for task := range ch {

内容来自samhan666

fmt.Println(task)

内容来自samhan666

} 内容来自samhan666

wg.Done()

zvvq

}(ch)

内容来自zvvq,别采集哟

}

内容来自zvvq,别采集哟

// 将任务发送到管道 内容来自zvvq,别采集哟

for _, task := range tasks { zvvq好,好zvvq

ch <- task

copyright zvvq

}

zvvq好,好zvvq

// 关闭管道 内容来自zvvq,别采集哟

close(ch)

内容来自zvvq,别采集哟

// 等待 goroutine 池完成

内容来自samhan666

wg.Wait() 本文来自zvvq

}

内容来自samhan666

以上就是golang并发编程中的管道与消息队列的详细内容,更多请关注其它相关文章!

内容来自zvvq