安装Cronexpr包:

go get -u github.com/gorhill/cronexpr

这个包支持七位时间控制

*(秒) *(分) *(时) *(日) *(月) *(周) *(年)

栗子:

每5秒执行一次: */5 * * * * * *

一个简单的小栗子

package main

import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
)
//* * * * * * *
//秒 分 时 日 月 周 年
func main() {
var expr *cronexpr.Expression
var err error
//每5秒执行一次
if expr, err = cronexpr.Parse("*/5 * * * * * *");err != nil{
fmt.Println("err=", err)
return
} //当前时间
now := time.Now()
fmt.Println("now=",now)
nextTime := expr.Next(now)
fmt.Println("nextTime=", nextTime) time.AfterFunc(nextTime.Sub(now), func() {
fmt.Println("被调用了")
}) time.Sleep(6*time.Second)
}

输出

now= 2020-05-03 00:58:48.6350048 +0800 CST m=+0.008000001
nextTime= 2020-05-03 00:58:50 +0800 CST
被调用了

注意:这里每5秒也好,每3分钟也好,都不是以现在的时间计时的:

例如:

每5秒:假设现在12:00:02,下次执行时间将会是12:00:05,他会从0秒开始累加计算下次时间,而不是现在的秒数

每3分钟:假设现在12:00:02,下次执行时间将会是12:03:00,他会从0分开始累加计算,并且秒数归零

一个并发多任务的定时任务小案例

package main

import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
) //代表任务
type CronJob struct {
expr *cronexpr.Expression
nextTime time.Time
} func main() {
//创建map,用于存储多个定时任务
scheduleTable := make(map[string]*CronJob) //当前时间
now := time.Now() expr, _ := cronexpr.Parse("*/5 * * * * * *")
cronJob := &CronJob{
expr:expr,
nextTime:expr.Next(now),
}
scheduleTable["job1"] = cronJob expr, _ = cronexpr.Parse("*/4 * * * * * *")
cronJob = &CronJob{
expr:expr,
nextTime:expr.Next(now),
}
scheduleTable["job2"] = cronJob go func() {
for{
now := time.Now()
//遍历map,取出每一个定时任务,检查是否过期
for jobName, cronJob := range scheduleTable{
//当前定时任务下次执行的时间在当前时间之前或者等于当前时间
if cronJob.nextTime.Before(now)||cronJob.nextTime.Equal(now){
//开启协程,执行定时任务
go func(jobName string) {
fmt.Println("执行:", jobName)
}(jobName)
//计算下一次调度的时间
cronJob.nextTime = cronJob.expr.Next(now)
fmt.Println(jobName, "下次执行时间:",cronJob.nextTime)
}
}
select {
case <-time.NewTimer(100 * time.Millisecond).C: }
}
}()
time.Sleep(100*time.Second)
}

  

Go语言web开发---Cronexpr 包实现并发定时任务的更多相关文章

  1. Go语言web开发---Beego基础

    一.框架 框架:可复用的设计组件,它规定了应用的体系结构,明确了整个设计,协作各个组件之间的依赖关系,责任分配,和流程控制.通俗解释框架就是一堆代码的集合,为了提高软件的开发效率和质量,一般都会使用框 ...

  2. Go语言web开发---Beego的cookie

    1.简介 (1)Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否是同一个客户端,这样的设计严重阻碍了web程序的设计. (2)Cookie是解决Http协议无 ...

  3. Go语言web开发---Beego路由

    参考链接(查看更多):https://beego.me/docs/mvc/controller/router.md 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由, ...

  4. Go语言web开发---Beego的session

    一.简介 Session是一段保存在服务器上的信息,当客户端第一次访问服务器时创建Session,同时也会创建一个名为beegosessionID,值为创建的Session的id的Cookie. 这个 ...

  5. 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

    一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...

  6. Spring整合web开发

    正常整合Servlet和Spring没有问题的 public class UserServlet extends HttpServlet { public void doGet(HttpServlet ...

  7. 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)

    了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发) Guillermo Rauch 编   赵静 译 ISBN 978-7-121-21769-2 2 ...

  8. 大数据平台R语言web UI应用架构 设计与开发

    1. 系统拓扑图 在日常业务分析中,R是非常常用的分析工具,而当数据量较大时,用R语言需要需用更多的时间来完成训练模型,spark作为大规模数据处理框架,采用内存计算,可以短时间内完成大量的数据的处理 ...

  9. Java在Web开发语言上败给了PHP

    PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...

随机推荐

  1. 小白学PID-以大疆M3508、M2006为例

    前言: 最近用到了大疆的直流无刷(BLDC)减速电机M3508和M2006.做RoboMaster比赛的同学应该对它们很熟悉,这两款电机质量都不错,配套电调C620.C610功能强大,应用场景广泛.当 ...

  2. Linux下磁盘分区、卸载和磁盘配额

    目录 一:查看磁盘信息 二:Linux磁盘分区 三:Linux分区的卸载 四:Linux磁盘配额 一:查看磁盘信息 fdisk : 这个命令是磁盘分区表操作工具,fdisk能将磁盘分区,同时也能为每个 ...

  3. Node-Web应用框架Express

    Express 是 node.js Web应用框架, 帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网站. Express 框架核心特性: ...

  4. 删除自定义服务 寒江孤钓<<windows 内核安全编程>> 学习笔记

    书中第一章 成功启动first服务之后, 发现书中并没有介绍删除服务的方式, SRVINSTW工具中的移除服务功能,也无法找到我们要删除的服务, 于是,搜素了下,发现解决方法如下: 在cmd中输入 & ...

  5. Day008 数组的使用

    数组的使用 For-Each循环 数组作方法入参 数组作返回值 用普通for循环遍历 int[] arrays={1,2,3,4,5}; //打印全部的数组元素 for (int i = 0; i & ...

  6. maven工程添加servlet依赖

    实现导入HttpServlet <!-- Servlet依赖--> <dependency> <groupId>javax.servlet</groupId& ...

  7. 使用花生壳、瑞友天翼远程访问金蝶K3

    金蝶版本号 WISE15.1 瑞友6.0系列 花生壳5 金蝶软件无法通过外网直接访问 因此需要使用瑞友天翼来实现远程访问 一般来说 金蝶服务器固定了IP地址以后 通过路由器开房两个外网端口即可实现瑞友 ...

  8. TLB和CPU缓存

    TLB 如果每次应用程序访问一个线性地址都需要先解析(查PDT,PTT)那么效率十分低,为了提高执行效率CPU在CPU内部建立了一个TLB表,此表和寄存器一样访问速度极高.其会记录线性地址和物理地址之 ...

  9. 关于MDI多文档程序的一些思考

    MDI程序的框架 客户窗口是一个预定义的窗口类(MDICLIENT),它是框架窗口的子窗口同时也是各个子文档窗口的父窗口.框架窗口和各个子文档窗口都是自定义的窗口类. MDI程序中的一些要点 窗口中的 ...

  10. c#操作斑马打印机打印中文

    需要引用fnthex32.dll插件,这个网上就能下到,注意分为两个版本,一个版本是8个参数,一个版本是9个参数,我这里用的是9个参数的. 首先用zebradesigner设计一个打印模板 差不多就长 ...