首页 > 其他分享 >Golang协程池ants

Golang协程池ants

时间:2023-12-27 10:14:13浏览次数:30  
标签:wg 10 fmt ants Golang 协程池 func Printf

官方示例

package main

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

var sum int32

func myFunc(i interface{}) {
	n := i.(int32)
	atomic.AddInt32(&sum, n)
	fmt.Printf("run with %d\n", n)
}

func demoFunc() {
	time.Sleep(10 * time.Second)
	fmt.Println("Hello World!")
}

func main() {
	defer ants.Release()

	runTimes := 10

	// 使用公共资源池
	var wg sync.WaitGroup
	syncCalculateSum := func() {
		demoFunc()
		wg.Done()
	}
	for i := 0; i < runTimes; i++ {
		wg.Add(1)
		_ = ants.Submit(syncCalculateSum)
	}
	wg.Wait()
	fmt.Printf("running goroutines: %d\n", ants.Running())
	fmt.Printf("finish all tasks.\n")

	// 使用函数池
	// 设置10为池的容量
	p, _ := ants.NewPoolWithFunc(10, func(i interface{}) {
		myFunc(i)
		wg.Done()
	})
	defer p.Release()
	// 逐个提交任务
	for i := 0; i < runTimes; i++ {
		wg.Add(1)
		//传参
		_ = p.Invoke(int32(i))
	}
	wg.Wait()
	fmt.Printf("running goroutines: %d\n", p.Running())
	fmt.Printf("finish all tasks, result is %d\n", sum)
}

普通方式

package main

import (
	"fmt"
	"sync"

	"github.com/panjf2000/ants/v2"
)

func main() {
	// 创建一个大小为10的Goroutine池
	pool, _ := ants.NewPool(10)
	// 等待组,用于等待所有任务完成
	var wg sync.WaitGroup
	wg.Add(10)

	for i := 0; i < 10; i++ {
		// 提交任务到池中
		pool.Submit(func() {
			defer wg.Done()
			fmt.Println("Executing task")
		})
	}
	// 等待所有任务完成
	wg.Wait()
	// 关闭池
	pool.Release()
}

标签:wg,10,fmt,ants,Golang,协程池,func,Printf
From: https://www.cnblogs.com/qcy-blog/p/17929878.html

相关文章

  • Golang压测ws
    packagemainimport( "fmt" "log" "sync" "time" "github.com/gorilla/websocket")funcmain(){ //设置要压测的WebSocket服务地址 url:="ws://192.168.252.128:8080/" //设置并发请求数量 concurrency:=1......
  • golang 的github.com/sony/sonyflake IP问题bug
    使用容器部署golang项目时,饮用了github.com/sony/sonyflake生成snowid,初始化时不传入任何参数:SnowId=sonyflake.NewSonyflake(sonyflake.Settings{})在容器的ip设置设置为类似:192.18.10.8时,调用生成id存在空指针报错。snowId,err:=global_conf.SnowId.NextID()处理......
  • Golang 常用工具记录
    Golang常用工具记录1golang类1.1日常使用的copier复制结构体到另外一个结构体等等类似的功能asynqGo中简单、可靠、高效的分布式任务队列,使用redis做为brokermachineryMachinery是基于分布式消息传递的异步任务队列/作业队列。restyresty是Go语言的一个H......
  • golang快速入门:并发编程(一)
    进程、线程和协程进程:是操作系统中的一个执行实体,它拥有独立的内存空间和系统资源。每个进程都是独立运行的,它们之间相互隔离,通过进程间通信(IPC)来进行数据交换。每个进程都有自己的地址空间、堆栈和文件描述符等。进程之间的切换开销较大,因为需要保存和恢复整个进程的状态。线程:是......
  • #1 BanG Dream It's MyGolang!!!!!
    长期素食导致的-[pixiv111124804]睦头人(\(\mathrm{a\color{red}{ctypedef}}\)诱捕器)-[pixiv110897467]但是这其实是一篇正经的Golang上手简记,并不是MyGO简评(MyGO简评还在咕着(大概率不补了鉴于后端用go,有必要开展golang大学习references:Go语言圣经......
  • golang中的fs.ReadDir
    平时习惯了./和../作为访问目录的路径,但今天使用golang中fs.ReadDir这个函数的时候发现这个习惯是不正确的。但是常用的命令并没有分很清楚.和./在这几个命令中使用.或./都可以到达目录下lscd错误示范packagemainimport( "fmt" "io/fs" "os")funcmain(){ fsf......
  • golang简单判断22-65535开发情况
    packagemainimport( "fmt" "net" "sync" "time")funcmain(){ server:="42.51.129.175"//要检查的服务器地址 ports:=make([]int,65535)//要检查的端口范围,从22到65535 fori:=22;i<=65535;i++{ ports......
  • 【go】Go (Golang) 语言-Golang 定时器Timer和Ticker、time.AfterFunc、time.NewTicke
    Golang定时器Timer和TickerGolang定时器包括:一次性定时器(Timer)和周期性定时器(Ticker)。编程中经常会通过timer和ticker、AfterFunc定时器NewTicker是设定每隔多长时间触发的,是连续触发,而计时器NewTimer是等待多长时间触发的,只触发一次,两者是不同的。等待时间函数AfterFunc是......
  • golang快速入门:结构体
    结构体Go语言的面向对象编程与我们之前所熟悉的PHP、Java那一套完全不同,没有 class、extends、implements 之类的关键字和相应的概念,而是借助结构体来实现类的声明。typePersonstruct{namestring//名字malebool//性别}可以理解为类名 Person,并且包含了 ......
  • golang封装命令做pipe管道
    packagemainimport( "fmt" "io" "os/exec")funcmain(){ fmt.Println("vim-go") //pipeReader,pipeWriter:=io.Pipe() binPath:="../03-ncpk-nvm/nvm" binArgs:=[]string{ "-debug",......