首页 > 其他分享 >[go]timewheel选择

[go]timewheel选择

时间:2023-03-01 16:01:27浏览次数:40  
标签:timewheel printMem KB timer 选择 func go AfterFunc

当系统定时任务很多的时候,用标准库的time会增加内存和cpu的使用,所以前辈提出了timewheel的东西,找了一下github上timewheel有挺多的。

看一下前几个

github.com/ouqiang/timewheel

代码超少200行,但是我不太喜欢他的的接口设计... 我是希望接口是和标准库一样的 func AfterFunc(d Duration, f func()) 他func AfterFunc(d Duration, args any)  ;而且不支持定时任务

github.com/rfyiamcool/go-timewheel

支持定时任务;但是用的时候发现定时任务小于timewheel的tk的时候会失效,所以感觉不是很舒服

github.com/antlabs/timer

提供两种实现;默认timer,10ms检查一下任务感觉太频繁;min_heap实现,基本看到没有空跑cpu,感觉他的实现还是不错的(添加任务的时候唤醒运行线程,任务做完了让线程阻塞到下一个任务的触发时间);支持定时任务,支持自定义定时规则。我喜欢这个

 

测试了一下

	count := 100000
	d := time.Second * 3

	fmt.Println("\ntimer")
	printMem()  // 输出2917 KB
	newTimer := timer.NewTimer(timer.WithMinHeap())
	var wg3 sync.WaitGroup
	for i := 0; i < count; i++ {
		wg3.Add(1)
		newTimer.AfterFunc(d, func() {
			wg3.Done()
		})
	}
	go newTimer.Run()
	printMem()  //输出13859 KB
	wg3.Wait()
	newTimer.Stop()
	runtime.GC()
	printMem() // 输出3022 KB

	fmt.Println("\ntimewheel")
	printMem()  // 3024 KB
	var wg2 sync.WaitGroup
	for i := 0; i < count; i++ {
		wg2.Add(1)
		timewheel.AfterFunc(d, func() {
			wg2.Done()
		})
	}
	printMem() // 30442 KB
	wg2.Wait()
	runtime.GC()
	printMem() // 5957 KB

	fmt.Println("\nstd time")
	printMem()  // 5959 KB
	var wg sync.WaitGroup
	for i := 0; i < count; i++ {
		wg.Add(1)
		time.AfterFunc(d, func() {
			wg.Done()
		})
	}
	printMem() // 18204 KB
	wg.Wait()
	printMem()  // 50736 KB

  测试结果内存方面timer是最好的,然后肉眼观察了一下cpu,标准库cpu会比其它两个高些。

 

挖坑

1. timewheel原理和实现 

2. 为什么timer表现更好

 

标签:timewheel,printMem,KB,timer,选择,func,go,AfterFunc
From: https://www.cnblogs.com/xiaotushaoxia/p/17168557.html

相关文章

  • TSBS 是什么?为什么时序数据库 TDengine 会选择它作为性能对比测试平台?
    去年8月我们在TDengine开发者大会上正式发布了TDengine3.0,TDengine也由此升级成为了一款云原生时序数据库(TimeSeriesDatabase,TSDB)。为了客观、准确、有效地评估......
  • (转)Go 语言“可变参数函数”终极指南
    原文:https://studygolang.com/articles/11965什么是可变参数函数?可变参数函数即其参数数量是可变的——0个或多个。声明可变参数函数的方式是在其参数类型前带上省略......
  • MongoDB添加远程连接访问
    在bin文件夹下增加配置 mongod.cfgsystemLog:destination:filepath:c:\data\log\mongod.logstorage:dbPath:c:\data\dbnet:bindIp:127.0.0.1......
  • geotools存储带高程的Polygon(PolygonZM)
    geotools读取带高程的Polygon:geotools写入带高程的Polygon:>>Postgis如何读写带高程的多边形:https://www.cnblogs.com/2008nmj/p/17109774.html(MultiPolygonZ)   ST......
  • golang 连接clickhouse
    1.驱动:"github.com/ClickHouse/clickhouse-go/v2"2.连接代码:packagemodelimport("database/sql""fmt"_"github.com/ClickHouse/clickhouse-go/v......
  • Go special function
    initfunctioninit函数用来进行初始化,在每一个源文件里面的代码,init函数最开始执行init函数没有参数,同时也没有返回值anonymousfunction匿名函数,和javascript和dart......
  • go手动添加锁=安全
    packagemainimport("fmt""sync""time")//为了解决线程不安全,我们自己加锁typeconcurentMatstruct{mpmap[int]intsync.RWMutex}......
  • 游戏运营平台怎样搭建?如何选择联运平台?
    游戏运营平台可通过自己搭建或是选择成熟的游戏运营平台合作,自己搭建的成本高,需要花费很多人力和时间,涉及到的前后端程序开发耗费的时间比较久,搭建好了以后也没有直接可以接......
  • 手游平台代理怎么选择合适的平台?
    随着手游的迅速发展,受欢迎程度剧增,不少投资创业人员想要在手游市场上分一块蛋糕,就出现了一批想要进行手游平台创业的朋友,但是自己搭建一个手游平台投资成本高且有风险,因此许......
  • Django+vue 解决cookie跨域不携带问题
    Django+vue解决cookie跨域不携带问题问题描述使用djangosession保存用户登入的token,django会将sessionid通过cookie传到浏览器,用户下一次请求的时候带着cookie访问后端......