iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >GO语言怎么实现协程池管理
  • 168
分享到

GO语言怎么实现协程池管理

2023-06-20 16:06:27 168人浏览 安东尼
摘要

本篇内容介绍了“Go语言怎么实现协程池管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用channel实现协程池通过 Channel 实

本篇内容介绍了“Go语言怎么实现协程池管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

使用channel实现协程池

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

package mainimport ("fmt""io/ioutil""net/Http""sync")// Pool goroutine Pooltype Pool struct {queue chan intwg    *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.queuep.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 mainimport ("fmt""strconv""sync")// 任务对象type task struct {ProductionConsumer}// 设置消费者数目,也就是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 intHandler     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 = "定义任务数据格式" + iStrt.AddData(job)}}()// 消费者消费数据t.Consumer.disposeData(t.Production.Jobs)}

“GO语言怎么实现协程池管理”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: GO语言怎么实现协程池管理

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

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

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

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

下载Word文档
猜你喜欢
  • GO语言怎么实现协程池管理
    本篇内容介绍了“GO语言怎么实现协程池管理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用channel实现协程池通过 Channel 实...
    99+
    2023-06-20
  • GO实现协程池管理的方法
    使用channel实现协程池 通过 Channel 实现 Goroutine Pool,缺点是会造成协程的频繁开辟和注销,但好在简单灵活通用。 package main imp...
    99+
    2024-04-02
  • C语言怎么实现协程
    这篇文章主要介绍“C语言怎么实现协程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言怎么实现协程”文章能帮助大家解决问题。协程是一种用户空间的非抢占式线程,主要用来解决等待大量的IO操作的问题。...
    99+
    2023-06-17
  • C语言中怎么实现协程
    本篇内容主要讲解“C语言中怎么实现协程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中怎么实现协程”吧!协程vs线程对比使用多线程来解决IO阻塞任务,使用...
    99+
    2024-04-02
  • Go简单实现协程池的实现示例
    目录MPG模型通道的特性首先就是进程、线程、协程讲解老三样。 进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一...
    99+
    2024-04-02
  • Go语言中怎么实现HTTPS加密协议
    Go语言中怎么实现HTTPS加密协议,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Go语言Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况...
    99+
    2023-06-04
  • go语言实现mqtt协议的实践
    目录一、什么是MQTT二、Go语言MQTT服务器Broker的搭建三、Go客户端访问简单API一、什么是MQTT MQTT(Message Queuing Telemetry Tra...
    99+
    2024-04-02
  • go语言实现两个协程交替打印
    目录方法一:使用两个channel方法二:使用一个channel方法一:使用两个channel 这里channel CA 必须要有缓冲区,否则最后会报错 fatal error: a...
    99+
    2024-04-02
  • go语言怎么强制结束协程
    在Go语言中,我们可以使用runtime.Goexit()函数来强制结束当前协程。该函数会立即终止当前协程的执行,并将控制权返回给调...
    99+
    2023-10-21
    go语言
  • java基于quasar怎么实现协程池
    这篇文章主要讲解了“java基于quasar怎么实现协程池”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java基于quasar怎么实现协程池”吧!业务场景:golang与swoole都拥抱...
    99+
    2023-07-02
  • 深入理解Go语言中的TCPF协议实现
    抱歉,我无法为您提供具体的代码示例。但是我可以为您提供一个关于深入理解Go语言中TCP协议实现的文章草稿,请您查看: 随着互联网的快速发展,网络通信协议在软件开发中扮演着至关重要的角...
    99+
    2024-04-02
  • Go语言协程处理数据问题怎么解决
    本篇内容主要讲解“Go语言协程处理数据问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言协程处理数据问题怎么解决”吧!一、Goroutine当然第一个想到可能是采用协程处理循环里...
    99+
    2023-07-05
  • Go语言怎么实现CGO编程
    本文小编为大家详细介绍“Go语言怎么实现CGO编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言怎么实现CGO编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。基于 C 标准库实现最简单的 CGO 程序...
    99+
    2023-07-05
  • go语言多线程怎么实现
    在Go语言中,可以使用goroutine来实现多线程。goroutine是Go语言中的轻量级线程,可以同时运行在一个操作系统线程上。...
    99+
    2023-10-21
    go语言
  • go语言中的协程实例分析
    这篇文章主要讲解了“go语言中的协程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言中的协程实例分析”吧!协程的特点该任务的业务代码主动要求切换,即主动让出执行权限发生了IO,...
    99+
    2023-07-02
  • go语言协程指的是什么
    这篇文章主要讲解了“go语言协程指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go语言协程指的是什么”吧!在go语言中,协程(goroutine)是指在后台中运行的轻量级执行线程;...
    99+
    2023-07-04
  • go语言如何实现两个协程交替打印
    这篇“go语言如何实现两个协程交替打印”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言如何实现两个协程交替打印”文章吧...
    99+
    2023-06-29
  • Go语言实现AOI区域视野管理流程详解
    目录一.定义管理器接口二.定义区域tower三.AOI的具体方法实现1.进入实现2.离开区域3.移动4.同步优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量,第二个是尽量降...
    99+
    2023-03-06
    Go AOI区域视野管理 Go AOI视野管理
  • Golang协程池gopool怎么设计与实现
    这篇文章主要介绍“Golang协程池gopool怎么设计与实现”,在日常操作中,相信很多人在Golang协程池gopool怎么设计与实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang协程池gopo...
    99+
    2023-06-30
  • go协程是怎么实现的
    Go协程是通过Go语言的运行时(runtime)来实现的。当程序启动时,runtime会创建一个主线程(也称为主协程),然后在主线程...
    99+
    2023-10-21
    go
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作