背景

golang中使用并发要考虑很多问题,如控制并发量等待Goroutine执行完毕等。
看下面一段代码:

var wg sync.WaitGroup
count := 10
wg.Add(count)
limitGoroutineCount := make(chan int,5)
for i:=0;i<count;i++{
go func(a int){
limitGoroutineCount <- 1
if time.Now().Second()%4==0{
wg.Done()
<- limitGoroutineCount
return
}
fmt.Println(a)
wg.Done()
<- limitGoroutineCount
}(i)
}
wg.Wait()

其实真正的业务代码也就是:

for i:=0;i<count;i++{
if time.Now().Second()%4==0{
return
}
fmt.Println(a)
}

gpool简介

gpool能做到让开发人员专注业务,而不是满屏的并发相关的代码
gpool代码仓库:https://github.com/GuoFlight/gpool

导入gpool

import "github.com/GuoFlight/gpool"

example

//测试函数
func Test1(a int)int{
return a
}
func main() {
//得到进程池对象
gp := gpool.NewDefault() //默认最大并发限制为10
//将函数添加到线程池中
for i:=0;i<1000;i++{
err := gp.AddGoroutine(Test1,i)
if err!=nil{
fmt.Println(err)
}
}
//执行线程池中的goroutine,默认会阻塞
gp.Run()
//得到结果,这里会乱序输出0到999
for _,v1 := range gp.RetList{
for _,v2 := range v1{
fmt.Println(v2)
}
}
}

创建gpool对象

使用默认配置:

  • 默认情况下,最大并发限制为10
  • 默认情况下,执行Run方法会阻塞
gp := gpool.NewDefault()

自定义配置:

// 这里相当于gp := gpool.NewDefault()
// 参数1:最大并发数量
// 参数2:执行Run方法是否阻塞
gp := gpool.New(10,true)

那年,郭少在京城。

Golang线程池gpool的更多相关文章

  1. Golang 线程池

    经常会用到协程,但是不能一下开那么多协调,只需要 poolSize 个即可,多了不行.这些个协程在执行完后必须等其完成之后才能进行下一步动作.假定工作方法为 work . package main i ...

  2. .net线程池内幕

    本文通过对.NET4.5的ThreadPool源码的分析讲解揭示.NET线程池的内幕,并总结ThreadPool设计的好与不足. 线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程 ...

  3. .net线程池

    线程池的作用线程池,顾名思义,线程对象池.Task和TPL都有用到线程池,所以了解线程池的内幕有助于你写出更好的程序.由于篇幅有限,在这里我只讲解以下核心概念: 线程池的大小 如何调用线程池添加任务 ...

  4. java线程池,工作窃取算法

    前言 在上一篇<java线程池,阿里为什么不允许使用Executors?>中我们谈及了线程池,同时又发现一个现象,当最大线程数还没有满的时候耗时的任务全部堆积给了单个线程, 代码如下: T ...

  5. 线程池+同步io和异步io(浅谈)

    线程池+同步io和异步io(浅谈) 来自于知乎大佬的一个评论 我们的系统代码从同步方式+线程池改成异步化之后压测发现性能提高了一倍,不再有大量的空闲线程,但是CPU的消耗太大,几乎打满,后来改成协程化 ...

  6. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  7. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  8. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  9. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  10. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

随机推荐

  1. 数据分析之重要模块pandas

    1.简介 基于Numpy构建 pandas的出现,让Python语言成为使用最广泛而且强大的数据分析环境之一 pandas的主要功能 - 具备诸多功能的两大数据结构 Series.DataFrame( ...

  2. Redis 5集群部署

    1.redis特点 (1)基于内存 (2)可持久化数据 (3)具有丰富的数据结构类型,适应非关系型数据的存储需求 (4)支持绝大多数主流开发语言,如C.C++.Java.Python.R.JavaSc ...

  3. Solution Set - 贪心和数据结构

    感觉自己好菜啊,这个专题真的不太会. CF1439C Greedy Shopping Link&Submission. 容易发现,当此人连续买了一段物品之后,他的钱数至少减半.所以他最多只会买 ...

  4. WEB服务与NGINX(17)- https协议及使用nginx实现https功能

    目录 1. https协议及使用nginx实现https功能 1.1 https协议概述 1.2 TLS/SSL协议原理 1.3 https的实现原理 1.4 使用openssl申请证书 1.5 ng ...

  5. CSS样式(第二篇)

    ​ CSS样式(第二篇) 关于定位position: li.widget {position: relative;}相对定位,设定一个参照物. @media (max-width: 980px) .t ...

  6. 深入理解Django:中间件与信号处理的艺术

    title: 深入理解Django:中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories: 后端开发 ta ...

  7. Splashtop和 TiFlux 宣布建立合作伙伴关系

    2020年9月21日,远程访问解决方案的全球领导者 Splashtop Inc. 和面向 IT 服务提供商的 IT 解决方案公司 TiFlux 宣布建立合作伙伴关系,以整合 Splashtop 远程访 ...

  8. 2022年官网下安装Tomcat最全版与官网查阅方法

    目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 ...

  9. C 语言编程 — 高级数据类型 — 指针

    目录 文章目录 目录 前文列表 指针 声明指针 使用指针 NULL 指针 指针的算术运算 指向指针的指针 将指针作为实际参数传入函数 从函数返回指针 一个古老的笑话 前文列表 <程序编译流程与 ...

  10. 在友晶DE10-Lite开发板实现8051单片机

    在友晶DE10-Lite开发板实现8051单片机 1. 移植过程 利用FPGA片内资源构建51系统.软核来自https://www.oreganosystems.at/.还需要添加rom.ram和ra ...