Go语言web开发---Cronexpr 包实现并发定时任务
安装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 包实现并发定时任务的更多相关文章
- Go语言web开发---Beego基础
一.框架 框架:可复用的设计组件,它规定了应用的体系结构,明确了整个设计,协作各个组件之间的依赖关系,责任分配,和流程控制.通俗解释框架就是一堆代码的集合,为了提高软件的开发效率和质量,一般都会使用框 ...
- Go语言web开发---Beego的cookie
1.简介 (1)Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否是同一个客户端,这样的设计严重阻碍了web程序的设计. (2)Cookie是解决Http协议无 ...
- Go语言web开发---Beego路由
参考链接(查看更多):https://beego.me/docs/mvc/controller/router.md 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由, ...
- Go语言web开发---Beego的session
一.简介 Session是一段保存在服务器上的信息,当客户端第一次访问服务器时创建Session,同时也会创建一个名为beegosessionID,值为创建的Session的id的Cookie. 这个 ...
- 关于Web开发里并发、同步、异步以及事件驱动编程的相关技术
一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有 ...
- Spring整合web开发
正常整合Servlet和Spring没有问题的 public class UserServlet extends HttpServlet { public void doGet(HttpServlet ...
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发) Guillermo Rauch 编 赵静 译 ISBN 978-7-121-21769-2 2 ...
- 大数据平台R语言web UI应用架构 设计与开发
1. 系统拓扑图 在日常业务分析中,R是非常常用的分析工具,而当数据量较大时,用R语言需要需用更多的时间来完成训练模型,spark作为大规模数据处理框架,采用内存计算,可以短时间内完成大量的数据的处理 ...
- Java在Web开发语言上败给了PHP
PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...
随机推荐
- hdu4499 搜索
题意: 给你一个棋盘,最大是5*5的,问你最多可以放多少个炮,炮和炮之间不可以相互攻击,这块只的是只能走一步,不存在两个炮中间三个棋子的情况.. 思路: 刚开始想的是把所有的空位置都 ...
- IDA动态调试Android的DEX文件
Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...
- hdu2235 机器人的容器
题意: 机器人的容器 Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- LA3644简单并查集判环
题意: 有n个化合物,每个化合物是两种元素组成,现在要装车,但是一旦车上的化合物中的某几个化合物组成这样一组关系,有n个化合物正好用了n中元素,那么就会爆炸,输入的顺序是装车的顺序,对于每 ...
- Windows核心编程 第八章 用户方式中线程的同步(下)
8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...
- 2020腾讯Android岗初级到高级面试真题收录解析
前言 马上就要到金九银十面试季了,需要找工作的小伙伴可以开始刷题复习了. 今天给大家分享的是博主腾讯面试的面经以及对腾讯2020上半年Android开发岗面经真题收录,希望可以帮助到大家,喜欢的朋友可 ...
- 快速运行cmd
方法一 运行 windows+r 输入cmd 指定要手动输入cd ...... 方法二 文件地址栏 在指定路径在文件地址栏前面输入cmd 方法三 shift+鼠标右键 打开到指定文件夹,shift+鼠 ...
- mongodb 在PHP中常见问题及解决方法
1.$in needs an array 解决:查询用到in操作的时候,说in操作对应的不是我一个数组,或者数组索引不是以0开始的 方法:array_values重新生成一个索引为0开始的数组即可 $ ...
- 在微信框架模块中,基于Vue&Element前端,通过动态构建投票选项,实现单选、复选的投票操作
最近把微信框架的前端改造一下,在原来基于Bootstrap框架基础上的微信后台管理,增加一套Vue&Element的前端,毕竟Vue的双向绑定开发起来也还是很方便的,而且Element本身也提 ...
- [题解] CF786B Legacy
前言 题目链接 题意 有 \(n\) 个点,\(q\) 次连边,以及起点 \(s\) .连边具体分三种: \(1\) \(v\) \(u\) \(w\) 从 \(v\) 到 \(u\) 连一条边. \ ...