go并发模式之----工作池/协程池模式

常见模式之四:工作池/协程池模式

定义

顾名思义,就是有固定数量的工人(协程),去执行批量的任务

使用场景

  • 适用于需要限制并发执行任务数量的情况

  • 创建一个固定大小的 goroutine 池,将任务分发给池中的 goroutine 并等待它们完成,使用带缓冲的通道来接收任务,以避免阻塞主线程

示例

有生产需求,建议使用大佬写的 ants库 ,以下是模拟协程池的简单示例

假设,我们有固定数量(2个)工人执行批量(4个)任务

Go 复制代码
package main

import (
	"fmt"
	"sync"
)

type Task struct {
	TaskFunc func() interface{}
}

type WorkerPool struct {
	Size    int
	Wg      *sync.WaitGroup
	Tasks   chan Task
	Results chan Result
}

type Result struct {
	ID  int
	Res interface{}
}

func NewWorkerPool(workerNum, taskBufSize int) *WorkerPool {
	return &WorkerPool{
		Size:    workerNum,
		Wg:      &sync.WaitGroup{},
		Tasks:   make(chan Task, taskBufSize),
		Results: make(chan Result, taskBufSize),
	}
}

func (w *WorkerPool) AddTask(task Task) {
	w.Tasks <- task
}

func (w *WorkerPool) Run() {
	for i := 1; i <= w.Size; i++ {
		w.Wg.Add(1)
		go func(id int) {
			defer w.Wg.Done()
			w.Work(id, w.Tasks, w.Results)
		}(i)
	}
}

func (w *WorkerPool) Work(Id int, tasks chan Task, results chan Result) {
	for task := range tasks {
		results <- Result{
			ID:  Id,
			Res: task.TaskFunc(),
		}
	}
}

func main() {
	pool := NewWorkerPool(3, 10)
	pool.Run()
	pool.AddTask(Task{TaskFunc: func() interface{} {
		return 2 * 3
	}})
	pool.AddTask(Task{TaskFunc: func() interface{} {
		return 4 * 5
	}})
	pool.AddTask(Task{TaskFunc: func() interface{} {
		return 6 * 7
	}})
	pool.AddTask(Task{TaskFunc: func() interface{} {
		return 8 * 9
	}})
	close(pool.Tasks)
	go func() {
		pool.Wg.Wait()
		close(pool.Results)
	}()
	for v := range pool.Results {
		fmt.Println(v.ID, v.Res)
	}
}
相关推荐
漂流幻境8 分钟前
IntelliJ IDEA的Terminal中执行ping命令时遇到的“No route to host“问题
java·ide·intellij-idea
IDOlaoluo10 分钟前
PHP-5.2.1.tar.gz 离线安装教程:从源码编译到配置的详细步骤(附安装包)
开发语言·php
苹果醋324 分钟前
element-ui源码阅读-样式
java·运维·spring boot·mysql·nginx
BUG?不,是彩蛋!28 分钟前
IntelliJ IDEA从安装到使用:零基础完整指南
java·ide·intellij-idea
程序员阿鹏33 分钟前
56.合并区间
java·数据结构·算法·leetcode
SmoothSailingT33 分钟前
IDEA实用快捷键
java·ide·intellij-idea
rengang6633 分钟前
Spring AI Alibaba 框架使用示例总体介绍
java·人工智能·spring·spring ai·ai应用编程
没有bug.的程序员34 分钟前
@Controller、@RestController、@RequestMapping 解析机制
java·spring boot·spring·controller·requestmapping·restcontroller
数据知道36 分钟前
Go语言设计模式:适配器模式详解
设计模式·golang·建造者模式
wangjialelele1 小时前
Qt中的常用组件:QWidget篇
开发语言·前端·c++·qt