Go 语言 并发模式实战 Worker Pool 与 Fan out 模式

Go阿木 发布于 2025-06-22 5 次阅读


Go 语言并发模式实战:Worker Pool 与 Fan-out 模式

在Go语言中,并发编程是其一大特色,也是其强大之处。正确地使用并发模式可以提高程序的执行效率,降低资源消耗。本文将围绕Go语言的并发模式,重点介绍Worker Pool与Fan-out模式,并通过实际代码示例进行实战解析。

一、

并发编程是指在同一时间段内,让多个任务同时执行。在Go语言中,并发主要依赖于goroutine和channel。goroutine是Go语言提供的轻量级线程,而channel则是goroutine之间通信的桥梁。

在并发编程中,Worker Pool和Fan-out模式是两种常见的并发模式。Worker Pool模式通过限制并发goroutine的数量,提高资源利用率;Fan-out模式则通过将任务分发到多个goroutine,提高程序的执行效率。

二、Worker Pool模式

Worker Pool模式是一种通过限制并发goroutine数量,提高资源利用率的并发模式。在Worker Pool模式中,主goroutine将任务分配给多个worker goroutine,而worker goroutine则从任务队列中取出任务进行处理。

2.1 Worker Pool模式原理

1. 创建一个任务队列,用于存放待处理的任务。

2. 创建多个worker goroutine,每个worker从任务队列中取出任务进行处理。

3. 当任务队列中没有任务时,worker goroutine可以阻塞等待,或者执行一些轻量级任务。

2.2 Worker Pool模式实现

go

package main

import (


"fmt"


"sync"


)

// Task 定义任务结构


type Task struct {


ID int


}

// WorkerPool 定义Worker Pool结构


type WorkerPool struct {


任务的队列


workerCount int


wg sync.WaitGroup


}

// NewWorkerPool 创建Worker Pool实例


func NewWorkerPool(queue TaskQueue, workerCount int) WorkerPool {


return &WorkerPool{


任务的队列: queue,


workerCount: workerCount,


}


}

// Start 启动Worker Pool


func (wp WorkerPool) Start() {


for i := 0; i < wp.workerCount; i++ {


wp.wg.Add(1)


go func() {


defer wp.wg.Done()


for {


task, ok := wp.任务的队列.Get()


if !ok {


break


}


// 处理任务


fmt.Printf("处理任务:%d", task.ID)


}


}()


}


}

// Stop 停止Worker Pool


func (wp WorkerPool) Stop() {


wp.任务的队列.Close()


wp.wg.Wait()


}

func main() {


// 创建任务队列


queue := NewTaskQueue()


// 创建Worker Pool


wp := NewWorkerPool(queue, 3)


// 启动Worker Pool


wp.Start()


// 添加任务


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


queue.Put(Task{ID: i})


}


// 停止Worker Pool


wp.Stop()


}


2.3 Worker Pool模式优缺点

优点:

1. 限制并发goroutine数量,提高资源利用率。

2. 简化任务分配和执行过程。

缺点:

1. 需要维护任务队列和worker goroutine。

2. 当任务量较大时,可能存在任务积压现象。

三、Fan-out模式

Fan-out模式是一种将任务分发到多个goroutine的并发模式。在Fan-out模式中,主goroutine将任务分发到多个worker goroutine,每个worker处理一部分任务。

3.1 Fan-out模式原理

1. 创建多个worker goroutine,每个worker负责处理一部分任务。

2. 主goroutine将任务分发到各个worker。

3. 各个worker并行处理任务。

3.2 Fan-out模式实现

go

package main

import (


"fmt"


"sync"


)

// Task 定义任务结构


type Task struct {


ID int


}

// FanOut 定义Fan-out结构


type FanOut struct {


workerCount int


wg sync.WaitGroup


}

// Start 启动Fan-out


func (fo FanOut) Start() {


for i := 0; i < fo.workerCount; i++ {


fo.wg.Add(1)


go func() {


defer fo.wg.Done()


for {


// 处理任务


fmt.Printf("处理任务:%d", Task{ID: i}.ID)


}


}()


}


}

// Stop 停止Fan-out


func (fo FanOut) Stop() {


fo.wg.Wait()


}

func main() {


// 创建Fan-out


fo := &FanOut{workerCount: 3}


// 启动Fan-out


fo.Start()


// 停止Fan-out


fo.Stop()


}


3.3 Fan-out模式优缺点

优点:

1. 提高程序的执行效率。

2. 简化任务分配和执行过程。

缺点:

1. 需要维护多个worker goroutine。

2. 当任务量较大时,可能存在资源竞争现象。

四、总结

本文介绍了Go语言的两种并发模式:Worker Pool和Fan-out模式。通过实际代码示例,展示了这两种模式的实现过程。在实际应用中,可以根据具体需求选择合适的并发模式,以提高程序的执行效率和资源利用率。