首页 > 其他分享 >Go时间轮

Go时间轮

时间:2024-10-08 16:11:12浏览次数:8  
标签:afterDiff tw delay beforeDiff 时间 func time Go

package main

import (
	"fmt"
	"github.com/rfyiamcool/go-timewheel"
	"sync"
	"sync/atomic"
	"time"
)

var (
	counter int64 = 0
	loopNum       = 50
	tw            = newTimeWheel()
	wg1           = sync.WaitGroup{}
	log           = new(logger)
)

func incrCounter() {
	atomic.AddInt64(&counter, 1)
}

func main() {
	go printCounter()

	batchRun5s()
	log.info("add finish")
	wg1.Wait()
}

func batchRun5s() {
	worker := 10000
	delay := 5
	beforeDiff := 1
	afterDiff := 2
	processTimer(worker, delay, beforeDiff, afterDiff)

	loop := 5
	taskNum := 50
	go processCallbackLoop(loop, taskNum, delay, beforeDiff, afterDiff)
}

func newTimeWheel() *timewheel.TimeWheel {
	tw, err := timewheel.NewTimeWheel(1*time.Second, 120)
	if err != nil {
		panic(err)
	}
	tw.Start()
	return tw
}

func processTimer(worker, delay, beforeDiff, afterDiff int) {
	for index := 0; index < worker; index++ {
		wg1.Add(1)
		var (
			htimer = tw.NewTimer(time.Duration(delay) * time.Second)
			incr   = 0
		)
		go func(idx int) {
			defer wg1.Done()
			for incr < loopNum {
				now := time.Now()
				target := now.Add(time.Duration(delay) * time.Second)
				select {
				case <-htimer.C:
					htimer.Reset(time.Duration(delay) * time.Second)
					end := time.Now()
					if end.Before(target.Add(time.Duration(-beforeDiff) * time.Second)) {
						log.error("timer befer: %s, delay: %d", time.Since(now).String(), delay)
					}
					if end.After(target.Add(time.Duration(afterDiff) * time.Second)) {
						log.error("timer after: %s, delay: %d", time.Since(now).String(), delay)
					}

					incrCounter()
					// fmt.Println("id: ", idx, "cost: ", end.Sub(now))
				}
				incr++
			}
		}(index)
	}
}

func processCallbackLoop(loop, taskCount, delay, beforeDiff, afterDiff int) {
	wg1.Add(1)
	for index := 0; index < loop; index++ {
		processCallback(taskCount, delay, beforeDiff, afterDiff)
		time.Sleep(time.Duration(delay) * time.Second)
	}
	wg1.Done()
}

func processCallback(taskCount, delay, beforeDiff, afterDiff int) {
	for index := 0; index < taskCount; index++ {
		now := time.Now()
		cb := func() {
			target := now.Add(time.Duration(delay) * time.Second)
			end := time.Now()
			if end.Before(target.Add(time.Duration(-beforeDiff) * time.Second)) {
				log.error("cb befer: %s, delay: %d", time.Since(now).String(), delay)
			}
			if end.After(target.Add(time.Duration(afterDiff) * time.Second)) {
				log.error("cb after: %s, delay: %d", time.Since(now).String(), delay)
			}
			incrCounter()
			// log.info("cost: %s, delay: %d", end.Sub(now), delay)
		}
		tw.Add(time.Duration(delay)*time.Second, cb)
	}
}

func printCounter() {
	now := time.Now()
	for {
		n := atomic.LoadInt64(&counter)
		log.info("start_time: %s, since_time: %s, counter %d", now.String(), time.Since(now).String(), n)
		time.Sleep(10 * time.Second)
	}
}

type logger struct{}

func (l *logger) info(format string, args ...interface{}) {
	v := fmt.Sprintf(format, args...)
	fmt.Println(v)
}

func (l *logger) error(format string, args ...interface{}) {
	v := fmt.Sprintf(format, args...)
	color := fmt.Sprintf("%c[%d;%d;%dm %s %c[0m", 0x1B, 5, 40, 31, v, 0x1B)
	fmt.Println(color)
}

标签:afterDiff,tw,delay,beforeDiff,时间,func,time,Go
From: https://www.cnblogs.com/qcy-blog/p/18451858

相关文章

  • go标准库encoding/gob使用
    func(c*cache)Save(wio.Writer)(errerror){enc:=gob.NewEncoder(w)deferfunc(){ifx:=recover();x!=nil{err=fmt.Errorf("ErrorregisteringitemtypeswithGoblibrary")}}()c.mu.RLock()defer......
  • 【开题报告】基于django+vue楼盘销售系统(论文+源码) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着房地产行业的蓬勃发展,楼盘销售管理的复杂性和效率要求日益提升。传统的手工记录与线下销售模式已难以满足当前市场快速变化的需求。特......
  • <免费开题>登录网站验证码的生成与识别系统(django)|全套源码+文章lw+毕业设计+课程设计
    <免费开题>登录网站验证码的生成与识别系统(django)|全套源码+文章lw+毕业设计+课程设计+数据库+ppt摘要近年来随着互联网应用技术的飞速发展,为了确保网站系统平台的安全性,各类网站相继推出了验证码应用技术,通过验证码的应用来帮助缓解暴力破解账户密码、垃圾邮件攻击以及在......
  • MongoDB 用户权限管理,复制集,分片集群,备份恢复 rocky使用
    1MongoDB介绍1.4什么时候使用MongoDB1.数据量是有亿万级或者需要不断扩容2.需要2000-3000以上的读写每秒3.新应用,需求会变,数据模型无法确定4.需要整合多个外部数据源5.系统需要99.999%高可用6.系统需要大量的地理位置查询7.系统需要提供最小的latency8.管理的主要数......
  • CRICOS Data Structures and AlgorithmsHash Tables
    DataStructuresandAlgorithmsHashTablesPage1of3CRICOSProvideCode:00301J Note:hashArraystoresthekey,valueandstate(used,free,orpreviously-used)ofeveryhashEntry.WemuststoreboththekeyandvaluesinceweneedtocheckhashArrayto......
  • GUI图形界面 无代码开发 原理 - 属性标识链 | uiotos致敬amis、nodered、appsmith、co
    低代码饱受争议。也有例外:后端NodeRed,前端Amis。整体还是诟病为主:简单业务可以,复杂的是扯淡,不论前后端。这是一贯的认知。在GUI方面,UIOTOS发明的嵌套技术,为复杂前端的无代码开发,开辟了一条新的思路。往期文章:可视化拖拉拽?过时了!组态零代码,不能做复杂前端?嵌套原理一复杂交互......
  • 组态也能开发WEB前端 | uiotos致敬amis、nodered、appsmith、codewave、goview、datar
    WEB组态开发SCADA、HMI画面、大屏可视化,还比较常见。比如下面: UIOTOS组态示例那么常规WEB前端功能,组态能否一并做了呢?比如下面这种: UIOTOS前端示例答案是可以的!UIOTOS支持页面无限嵌套,能实现原型即应用。现在就以一个具体小示例介绍如何实现的。效果如下所示,初......
  • [含文档+PPT+源码等]精品大数据项目-Django基于朴素贝叶斯实现的乡村旅游评论分析系统
    大数据项目——Django基于朴素贝叶斯实现的乡村旅游评论分析系统背景,可以从以下几个方面进行详细阐述:一、项目背景与意义随着乡村旅游的蓬勃发展和游客对旅游体验要求的日益提高,乡村旅游评论成为游客反馈旅游体验、旅游企业了解市场动态和游客行为的重要途径。然而,传统的评论......
  • [含文档+PPT+源码等]精品大数据项目-基于Django实现的汽车数据分析与可视化系统
    大数据项目——基于Django实现的汽车数据分析与可视化系统背景,可以从以下几个方面进行详细阐述:一、项目背景与意义在数字化和信息化的时代背景下,汽车行业正面临着前所未有的机遇与挑战。随着市场竞争的加剧、消费者需求的多样化以及技术的不断进步,汽车企业需要对市场进行深入......
  • django rest_framework面经
    1、什么是drf组件drf的全称是DjangoRESTfulFramework;它是一个基于django开发的组件,本质是一个django的app;drf可以帮我们快速开发出一个遵循restful规范的程序。2、drf组件提供的功能1.免除csrf认证2.视图(三种:(1)APIView,(2)ListAPIview,(3)GenericViewSet)3.版本处理4......