iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GO实现协程池管理的方法
  • 472
分享到

GO实现协程池管理的方法

2024-04-02 19:04:59 472人浏览 薄情痞子
摘要

使用channel实现协程池 通过 Channel 实现 Goroutine Pool,缺点是会造成协程的频繁开辟和注销,但好在简单灵活通用。 package main imp

使用channel实现协程池

通过 Channel 实现 Goroutine Pool,缺点是会造成协程的频繁开辟和注销,但好在简单灵活通用。


package main

import (
	"fmt"
	"io/ioutil"
	"net/Http"
	"sync"
)

// Pool goroutine Pool
type Pool struct {
	queue chan int
	wg    *sync.WaitGroup
}

// New 新建一个协程池
func New(size int) *Pool {
	if size <= 0 {
		size = 1
	}
	return &Pool{
		queue: make(chan int, size),
		wg:    &sync.WaitGroup{},
	}
}

// Add 新增一个执行
func (p *Pool) Add(delta int) {
	// delta为正数就添加
	for i := 0; i < delta; i++ {
		p.queue <- 1
	}
	// delta为负数就减少
	for i := 0; i > delta; i-- {
		<-p.queue
	}
	p.wg.Add(delta)
}

// Done 执行完成减一
func (p *Pool) Done() {
	<-p.queue
	p.wg.Done()
}

func (p *Pool) Wait() {
	p.wg.Wait()
}

func main() {
	// 这里限制100个并发
	pool := New(100) // sync.WaitGroup{}

	//假设需要发送1000万个http请求,然后我并发100个协程取完成这件事
	for i := 0; i < 10000000; i++ {
		pool.Add(1) //发现已存在100个人正在发了,那么就会卡住,直到有人完成了宣布自己退出协程了
		go func(i int) {
			resp, err := http.Get("https://www.baidu.com")
			if err != nil {
				fmt.Println(i, err)
			} else {
				defer resp.Body.Close()
				result, _ := ioutil.ReadAll(resp.Body)
				fmt.Println(i, string(result))
			}
			pool.Done()
		}(i)
	}
	pool.Wait()
}

消费者模式实现协程池

频繁对协程开辟与剔除,如果对性能有着很高的要求,建议优化成固定数目的协程取 channel 里面取数据进行消费,这样可以避免协程的创建与注销。


package main

import (
	"fmt"
	"strconv"
	"sync"
)

// 任务对象
type task struct {
	Production
	Consumer
}

// 设置消费者数目,也就是work pool大小
func (t *task) setConsumerPoolSize(poolSize int) {
	t.Production.Jobs = make(chan *Job, poolSize*10)
	t.Consumer.WorkPoolNum = poolSize
}

// 任务数据对象
type Job struct {
	Data string
}

func NewTask(handler func(jobs chan *Job) (b bool)) (t *task) {
	t = &task{
		Production: Production{Jobs: make(chan *Job, 100)},
		Consumer:   Consumer{WorkPoolNum: 10, Handler: handler},
	}
	return
}

type Production struct {
	Jobs chan *Job
}

func (c Production) ADDData(data *Job) {
	c.Jobs <- data
}

type Consumer struct {
	WorkPoolNum int
	Handler     func(chan *Job) (b bool)
	Wg          sync.WaitGroup
}

// 异步开启多个work去处理任务,但是所有work执行完毕才会退出程序
func (c *Consumer) disposeData(data chan *Job) {
	for i := 0; i <= c.WorkPoolNum; i++ {
		c.Wg.Add(1)
		go func() {
			defer func() {
				c.Wg.Done()
			}()
			c.Handler(data)
		}()
	}
	c.Wg.Wait()
}

func main() {
	// 实现一个用于处理数据的闭包,实现业务代码
	consumerHandler := func(jobs chan *Job) (b bool) {
		for jobs := range jobs {
			fmt.Println(jobs)
		}
		return
	}

	// new一个任务处理对象
	t := NewTask(consumerHandler)
	t.setConsumerPoolSize(500) // 500个协程同时消费

	// 根据自己的业务去生成数据通过AddData方法添加数据到生成channel,这里是100万条数据
	go func() {
		for i := 0; i < 1000000; i++ {
			job := new(Job)
			iStr := strconv.Itoa(i)
			job.Data = "定义任务数据格式" + iStr
			t.AddData(job)
		}
	}()

	// 消费者消费数据
	t.Consumer.disposeData(t.Production.Jobs)
}

到此这篇关于GO实现协程池管理的方法的文章就介绍到这了,更多相关go实现协程池内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GO实现协程池管理的方法

本文链接: https://www.lsjlt.com/news/130401.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GO实现协程池管理的方法
    使用channel实现协程池 通过 Channel 实现 Goroutine Pool,缺点是会造成协程的频繁开辟和注销,但好在简单灵活通用。 package main imp...
    99+
    2024-04-02
  • GO语言怎么实现协程池管理
    本篇内容介绍了“GO语言怎么实现协程池管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用channel实现协程池通过 Channel 实...
    99+
    2023-06-20
  • grpool goroutine池协程管理
    目录前言名词概念使用示例踩坑之旅常犯的错误分析原因使用grpool错误代码正确代码总结前言 goroutine协程非常轻量级,这也是为什么go支持高并发,但是goroutine频繁创...
    99+
    2024-04-02
  • Go简单实现协程池的实现示例
    目录MPG模型通道的特性首先就是进程、线程、协程讲解老三样。 进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一...
    99+
    2024-04-02
  • PHP底层的线程池与协程实现方法
    PHP底层的线程池与协程实现方法在PHP编程中,线程池和协程是提高性能和并发能力的重要方法。本文将介绍PHP底层实现线程池和协程的方法,并提供具体代码示例。一、线程池的实现线程池是一种重用线程的机制,可以提高多线程应用程序的性能。在PHP中...
    99+
    2023-11-08
    线程池 PHP底层 协程实现方法
  • Golang协程池的管理与优化
    协程池是一种用于高效处理任务的机制,通过池中协程(称为 "工作者")来并发执行任务。通过调整协程数量、使用缓冲通道、关闭协程池并监控其指标,可以优化协程池。协程池在实践中可用于处理图像处...
    99+
    2024-04-15
    golang 协程池
  • java基于quasar实现协程池的方法示例
    业务场景:golang与swoole都拥抱了协程,在同任务并发数量下,协程可比线程多几倍。所以最近在查询java时了解java本身是没有协程的,但是某牛自行实现了协程,也就是本文的主...
    99+
    2024-04-02
  • Go实现Redis连接池方法
    目录一、什么是连接池,连接池有什么用 二、代码展示 一、什么是连接池,连接池有什么用 先看看别人是怎么介绍连接池的吧: 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存...
    99+
    2024-04-02
  • Golang协程池的实现与应用
    目录1. 为什么需要协程池2. 使用协程池的优点3. 设计思路4. 实现一个简单的协程池4.1 Task 任务对象4.2 Pool协程池4.3 Main函数1. 为什么需要协程池 使...
    99+
    2023-05-19
    Golang协程池 Go协程池使用
  • Java线程池的实现方法
    本篇内容主要讲解“Java线程池的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程池的实现方法”吧!以前做的东西,实现一个简单的多线程机制,开始之前,现说说原理性的东西吧,下面...
    99+
    2023-06-17
  • Go实现线程池(工作池)的两种方式实例详解
    worker pool简介 worker pool其实就是线程池thread pool。对于go来说,直接使用的是goroutine而非线程,不过这里仍然以线程来解释线程池。 在线程...
    99+
    2024-04-02
  • Golang协程池gopool设计与实现
    目录Goroutine协程池gopool核心实现PoolTaskWorker整体来看三个角色的定位使用 sync.Pool 进行性能优化Goroutine Goroutine 是 G...
    99+
    2024-04-02
  • Go关闭goroutine协程的方法
    这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭goroutine,并介绍如何在Go语言中关闭goroutine的常见套路,包括...
    99+
    2023-07-06
  • Go协程如何实现
    本篇内容主要讲解“Go协程如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go协程如何实现”吧!为什么需要协程协程的本质是将一段数据的运行状态进行打包,可以在线程之间调度,所以协程就是在单...
    99+
    2023-07-04
  • go协程是怎么实现的
    Go协程是通过Go语言的运行时(runtime)来实现的。当程序启动时,runtime会创建一个主线程(也称为主协程),然后在主线程...
    99+
    2023-10-21
    go
  • Java基于quasar如何实现协程池
    这篇文章主要介绍了Java基于quasar如何实现协程池,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。业务场景:golang与swoole都拥抱了协程,在同任务并发数量下,协程可比线程多几倍。所以最近在查询java时了解...
    99+
    2023-07-02
  • GO workPool的线程池如何实现
    今天小编给大家分享一下GO workPool的线程池如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Go语言...
    99+
    2023-07-05
  • Go实现线程池的两种方式是什么
    这篇“Go实现线程池的两种方式是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go实现线程池的两种方式是什么”文章吧。w...
    99+
    2023-06-30
  • java基于quasar怎么实现协程池
    这篇文章主要讲解了“java基于quasar怎么实现协程池”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java基于quasar怎么实现协程池”吧!业务场景:golang与swoole都拥抱...
    99+
    2023-07-02
  • go中协程是怎么实现的
    在Go中,协程(goroutine)是通过Go语言的运行时系统(runtime)实现的。协程是一种轻量级的线程,它可以在相同的地址空...
    99+
    2023-10-20
    go
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作