Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

基本介绍

gtimer是一个并发安全的高性能任务定时器,类似于是一个并发安全的高性能定时器,类似于JavaTimergtimer组件旧版本采用的是分层时间轮(Hierarchical Timing Wheel)设计,从goframe v1.16版本开始,采用了优先级队列(底层采用了优先级队列PriorityQueue)实现。

使用场景

任何定时任务场景,大批量定时任务/延迟任务的场景,超时控制/频率控制的业务场景,对于定时时间准确度要求不高的业务场景。

注意事项

  • 任何的定时任务都是有误差的,在定时间隔比较大,或者并发量大,负载较高的系统中尤其明显,具体请参考:https://github.com/golang/go/issues/14410
  • 定时间隔不会考虑任务的执行时间。例如,如果一项工作需要3分钟才能执行完成,并且计划每隔5分钟运行一次,那么每次任务之间只有2分钟的空闲时间。
  • 需要注意的是单例模式运行的定时任务,任务的执行时间会影响该任务下一次执行的开始时间。例如:一个每间隔1秒执行的任务,运行耗时为1秒,那么在第1秒开始运行后,下一次任务将会在第3秒开始执行。因为中间有一次运行检查时发现有当前任务正在进行,因此退出等待下一次执行检查。

    使用方式:

    Code Block
    languagego
    import "github.com/gogf/gf/v2/os/gtimer"

    接口文档

    https://pkg.go.dev/github.com/gogf/gf/v2/os/gtimer

    简要说明: 

    1. New方法用于创建自定义的任务定时器对象,并可在创建时通过intervalTimerOptions参数指定定时器的最小tick时间间隔。方法用于创建自定义的任务定时器对象,并可在创建时TimerOptions传入参数,其中:
      • Interval指定定时器的最小tick时间间隔。
      •  Quick指定定时器是否启动时就执行一次(默认为false)。
    2. Add方法用于添加定时任务,其中:
      • interval 参数用于指定方法的执行的时间间隔。
      • job 参数为需要执行的任务方法。
    3. AddEntry方法添加定时任务,支持更多参数的控制。
    4. AddSingleton方法用于添加单例定时任务,即同时只能有一个该任务正在运行。定时任务,即同时只能有一个该任务正在运行
    5. AddOnce方法用于添加只运行一次的定时任务,当运行一次数后该定时任务自动销毁。
    6. AddTimes方法用于添加运行指定次数的定时任务,当运行times次数后该定时任务自动销毁。
    7. Search方法用于根据名称进行定时任务搜索(返回定时任务*Entry对象指针)。
    8. Start方法用于启动定时器(使用New创建定时器时会自动启动)。
    9. Stop方法用于停止定时器。
    10. Close方法用于关闭定时器。


    默认定时器

    大部分的场景下使用默认的定时器即可。使用gtimer的默认定时器时,默认的间隔时间为的默认定时器时,默认的定时检测间隔时间为100ms,因此理论的时间间隔误差范围为0~100ms。可以使用以下两种方式修改默认的定时器参数:

    1. 使用启动参数
      • gf.gtimer.interval=50: 修改默认的时间刻度为50毫秒
    2. 使用环境变量
      • GF_GTIMER_INTERVAL=50

    gtimergcron区别

    gtimer定时器模块与gcron定时任务模块区别:

  • gtimer属于高性能模块,是框架核心模块,构建任何定时任务的基础,任何方法操作耗时均在纳秒级别。
  • gtimer可适用于任何的定时任务场景中,例如: TCP通信、游戏开发等场景。
  • gcron支持经典的crontab形式的定时任务语法,最小时间设定间隔为
  • Note

    需要注意,定时器默认检测间隔时间越短,对CPU的使用量会越大。

    注意事项🔥

    1. 由于现代的计算机都是使用软件实现的定时器,任何的定时器都是存在误差的,不会完全精准,可能延迟,也甚至会提前,但是不会不执行。并且在定时间隔比较大,或者并发量大,负载较高的系统中尤其明显。参考链接:https://github.com/golang/go/issues/14410
    2. 由于误差是不可避免的,任何定时器的实现(不仅是框架的定时器,标准库的定时器亦是如此)都不会使用系统时间,而是使用一种固定的tick间隔。不要在定时器任务逻辑中使用系统时间来判断间隔做逻辑运算,这个时间的判断没有任何意义。
    3. 在不考虑误差的前提下,定时间隔不会考虑任务的执行时间。例如,如果一项工作需要3分钟才能执行完成,并且计划每隔5分钟运行一次,那么每次任务之间只有2分钟的空闲时间。
    4. 需要注意的是单例模式运行的定时任务,任务的执行时间会影响该任务下一次执行的开始时间。例如:一个每间隔1秒执行的任务,运行耗时为1秒,那么在第1秒开始运行后,下一次任务将会在第3秒开始执行。因为中间有一次运行检查时发现有当前任务正在进行,因此退出等待下一次执行检查。

    定时器与gcron区别

    具体请查看章节 定时任务-gcron与gtimer

    gcron底层实现基于gtimer

    相关文档

    Children Display
    alltrue
    excerptTypesimple




    Panel
    titleContent Menu

    Table of Contents