首页 > 其他分享 >panjf2000/ants:一个高性能的 goroutine 池管理工具

panjf2000/ants:一个高性能的 goroutine 池管理工具

时间:2023-05-15 15:34:53浏览次数:46  
标签:wg panjf2000 err goroutine ants 任务 func

简介

ants是一个高性能的 goroutine 池,实现了对大规模 goroutine 的调度管理、goroutine 复用,允许使用者在开发并发程序的时候限制 goroutine 数量,复用资源,达到更高效执行任务的效果。goroutine相比于线程来说,有着更轻量、资源占用更少、切换速度更快、无线程上下文切换开销更少等优势,但是也是不能无节制的创建使用。默认每个 goroutine 占用 8KB 内存,如果数量太多没有及时回收,也会使系统的内存资源耗尽。通过使用ants,可以实例化一个 goroutine 池,复用 goroutine ,节省资源,提升性能

安装

go get -u github.com/panjf2000/ants/v2

基础使用

package main

import (
	"fmt"
	"github.com/panjf2000/ants/v2"
	"log"
	"sync"
	"time"
)

func main() {

	var wg sync.WaitGroup

	// 生成一个具有特定函数的goroutine池 容量为10
	p, err := ants.NewPoolWithFunc(10, func(i interface{}) {
		taskFunc(i.(int))
		wg.Done()
	})
	if err != nil {
		log.Fatal("goroutine pool create err:", err)
	}
	defer p.Release() // 函数结束后关闭此池并释放工作队列

	for i := 0; i < 1000; i++ {
		wg.Add(1)       // 每执行一次进行+1计数
		_ = p.Invoke(i) //  提交一个任务到创建的goroutine池中
	}

	wg.Wait() // 阻塞等待任务执行完成
}

// taskFunc 执行耗时任务
func taskFunc(i int) {
	time.Sleep(2 * time.Second) // 模拟耗时任务
	fmt.Println("输出:", i)
}

上面是一个基本的使用案例,协程池去执行特定的任务函数,根据系统的性能去调整协程池的容量去达到最佳的运行效果

传递带参数的函数进入协程池

package main

import (
	"fmt"
	"github.com/panjf2000/ants/v2"
	"log"
	"sync"
	"time"
)

func main() {

	var wg sync.WaitGroup

	// 生成一个自定义goroutine池 容量为10
	p, err := ants.NewPool(10)
	if err != nil {
		log.Fatal("goroutine pool create err:", err)
	}
	defer p.Release() // 函数结束后关闭此池并释放工作队列

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		_ = p.Submit(taskFunc(i, &wg))
	}

	wg.Wait() // 阻塞等待任务执行完成
}

// taskFunc 执行耗时任务
func taskFunc(i int, wg *sync.WaitGroup) func() {
	return func() {
		time.Sleep(2 * time.Second) // 模拟耗时任务
		fmt.Println("输出:", i)
		wg.Done()
	}
}

创建协程池的配置参数

  • ExpiryDuration:清理 goroutine 的时间间隔。每隔一段时间,Ants 就会对池中未被使用的 goroutine 进行清理,减少内存占用
  • PreAlloc:是否在初始化工作池时预分配内存。对于一个超大容量,且任务耗时长的工作池来说,预分配内存可以大幅降低 goroutine 池中的内存重新分配损耗
  • MaxBlockingTasks:阻塞任务的最大数,0代表无限制
  • Nonblocking:工作池是否是非阻塞的,这决定了 Pool.Submit 接口在提交任务时是否会被阻塞
  • PanicHandler:任务崩溃时的处理函数
  • Logger:日志记录器

标签:wg,panjf2000,err,goroutine,ants,任务,func
From: https://www.cnblogs.com/xingzr/p/17401622.html

相关文章

  • GoLang 使用 goroutine 停止的几种办法
    [toc]前言我们有很多情况下需要主动关闭goroutine,如需要实现一个系统自动熔断的功能就需要主动关闭goroutine为什么要中断GoRoutine?场景:俩个相互依赖的的操作,“依赖”是指如果其中一个失败,那么另一个就没有意义,而不是第二个操作依赖第一个操作的结果(那种情况下,两个操作不能并行)。......
  • golang基础--Goroutine与Channel
    什么是goroutine?goroutine是go特有的并发体,是一种轻量级的线程,由go关键字启动。goroutine是Go语言提供的一种用户态线程,有时我们也称之为协程。所谓的协程,某种程度上也可以叫做轻量线程,它不由os,而由应用程序创建和管理,因此使用开销较低(一般为4K)。我们可以创建很多的gorou......
  • Goroutines example
    一个入门的goroutines例子packagemainimport("fmt""time")funcf(fromstring){fori:=0;i<3;i++{fmt.Println(from,":",i)}}funcmain(){f("direct")gof("gorout......
  • [网络安全]AntSword蚁剑实战解题详析
    免责声明:本文仅分享AntSword渗透相关知识,不承担任何法律责任。请读者自行安装蚁剑,本文不再赘述。蚁剑介绍蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。中国蚁剑的特点主要有如下几点:1.支持多平台......
  • [网络安全]DVWA之File Upload—AntSword(蚁剑)攻击姿势及解题详析合集
    免责声明:本文仅分享SQL攻击相关知识,不承担任何法律责任。DVWA、BurpSuite请读者自行安装,本文不再赘述。同类文章参考:[网络安全]AntSword(蚁剑)实战解题详析(入门)FileUpload—lowlevel源码中无过滤:上传包含一句话木马<?php@eval($_POST[qiushuo]);?>的文件qiu.php回显......
  • Go语言入门12(协程 goroutine)
    协程进程和线程进程​ 当运行一个应用程序的时候,操作系统会为这个应用程序启动一个进程。可以将这个进程看作一个包含了应用程序在运行中需要用到和维护的各种资源的容器。这些资源包括但不限于内存地址空间、文件和设备的句柄以及线程线程​ 一个线程是一个执行空间,这个空间......
  • go【goroutine】
    1. goroutine1.重点1.要搞清楚goroutine什么时候退出2.控制goroutine退出3.把并发给调用者 2.代码示例packagemainimport( "context" "fmt" "time")//1.使用chan创建//2run函数消费chan,做数据上报//3run函数交给调用者执行,run调用结束之后将stop发送......
  • 挑战程序设计竞赛---Ants
    Anarmyofantswalkonahorizontalpoleoflengthlcm,eachwithaconstantspeedof1cm/s.Whenawalkingantreachesanendofthepole,itimmediatellyfallsoffit.Whentwoantsmeettheyturnbackandstartwalkinginoppositedirections.Wekno......
  • ACCT867 Finance for Accountants
    ACCT867FinanceforAccountantsTrimesterOne,2023IndividualAssignmentDueDate:1stMay2023,at12:00pm(noon)Weighting:30%(20%forWrittenAssignmentand10%forOralPresentation)Type:IndividualassignmentLength:Maximum2,000words(excludingtab......
  • 【解题报告?】14 Understand Variants
    整个活。洛谷愚人节比赛2023的F题。这题一看就知道是WYXkk出的,高浓度解密元素(洛谷链接入口Understand和14MinesweeperVariants都看见过,但是都没自己玩过(可以先自己玩玩,挺好玩的(可以说是演绎法的练习?(Understand不贵,快买!(我还没买,会买的会买的)1.Tutorial教程。......