精华内容
下载资源
问答
  • gocron - 定时任务管理系统 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列 功能特性 Web界面管理定时任务 crontab时间...
  • Go Cron

    2019-03-15 14:33:16
    基本格式 分,时,日,月,星期,命令 常见用法 每1分钟执行1次 */1 * * * * 命令 第1-3分钟执行3次 ...已知Cron表达式是30 * * * * 如何计算命令下次调度时间 因此下次调度时间为2019/03/15 ...

    基本格式

    秒,分,时,日,月,星期,年,命令

    常见用法

    1. 每1分钟执行1次
      */1 * * * * 命令

    2. 第1-3分钟执行3次
      1-3 * * * * 命令

    3. 每天1点和2点整执行1次
      0 1,2 * * * 命令

    开源Cronexpr库

    Parse()解析与校验Cron表达式
    Next()根据当前时间,计算下次调度时间

    Cron调度逻辑

    已知当前时间为2019/03/15 14:40:00
    已知Cron表达式是30 * * * *
    下次调度时间为2019/03/15 15:30:00

    	var(
    		expr *cronexpr.Expression
    		err error
    		now time.Time
    		nextTime time.Time
    	)
    	if expr,err=cronexpr.Parse("*/1 * * * * * *");err!=nil{
    		fmt.Println(err)
    		return
    	}
    
    	now=time.Now()
    	fmt.Println("开始",now.Format("2006/1/2 15:04:05"))
    	nextTime=expr.Next(now)
    	time.AfterFunc(nextTime.Sub(now), func() {
    		fmt.Println("结束",nextTime.Format("2006/1/2 15:04:05"),"\n我被调度了嘤嘤嘤")
    	})
    	time.Sleep(2*time.Second)
    

    运行结果
    在这里插入图片描述

    调度多个任务

    type Cronjob struct {
    	expr *cronexpr.Expression
    	nextTime time.Time
    }
    func main(){
    	var(
    		cronjob *Cronjob
    		expr *cronexpr.Expression
    		now time.Time
    		scheduleTable map[string]*Cronjob
    	)
    	now=time.Now()
    	scheduleTable=make(map[string]*Cronjob)
    	expr=cronexpr.MustParse("*/5 * * * * * *")
    	cronjob=&Cronjob{
    		expr:expr,
    		nextTime:expr.Next(now),
    	}
    	scheduleTable["JobOne"]=cronjob
    	expr=cronexpr.MustParse("*/5 * * * * * *")
    	cronjob=&Cronjob{
    		expr:expr,
    		nextTime:expr.Next(now),
    	}
    	scheduleTable["JobTwo"]=cronjob
    	
    	go func() {
    		var(
    			jobName string
    			cronjob *Cronjob
    			now time.Time
    		)
    		for{
    			now=time.Now()
    			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(20 * time.Second)
    }
    

    运行结果

    在这里插入图片描述

    展开全文
  • gocron:一个Golang作业计划包。 gocron是一个Golang作业调度程序包,可让您使用简单,人性化的语法以预定的时间间隔定期运行Go函数。 gocron是Golang实施Ruby模块的和Python的作业调度包。 另请参阅这两篇出色的...
  • gocron v1.5 build error

    2021-01-08 04:12:39
    go build -o bin/gocron ./cmd/gocron cmd/gocron/gocron.go:11:2: use of internal package not allowed cmd/gocron/gocron.go:12:2: use of internal package not allowed cmd/gocron/gocron.go:13:2: use of ...
  • linux 运行 gocron

    2020-09-26 10:29:42
    3,看清楚自己的系统,需要下载gocrongocron-node两个包,gocron是web配置平台,gocron-node是需要在想要执行任务的节点服务器部署的程序 wget ...

    1,安装go :  yum install go

    2查看go版本

    go version

    3,看清楚自己的系统,需要下载gocron和gocron-node两个包,gocron是web配置平台,gocron-node是需要在想要执行任务的节点服务器部署的程序

    wget https://github.com/ouqiang/gocron/releases/download/v1.5.2/gocron-v1.5.1-linux-amd64.tar.gz

    wget https://github.com/ouqiang/gocron/releases/download/v1.5.2/gocron-node-v1.5.1-linux-amd64.tar.gz

     

    4,解压

    1

    2

    3

     

    tar -xvf gocron-v1.5.1-linux-amd64.tar.gz

     

    tar -xvf gocron-node-v1.5.1-linux-amd64.tar.gz

    5,web 端,需要linux开发5920端口

    打开web界面
    从上面可以看到gocron默认监听的是5920端口,通过浏览器访问:http://localhost:5920 或http://服务器ip:5920 便可以打开web管理窗口

     

    6,服务端,linux 需要开发 5921端口

    shell 需要配置节点

    需要切换到普通用户才能执行成功

     

    7,运行shell脚本

    和gocon-node 同级目录

    展开全文
  • go-cron - 一个简单的Go Cron库可以以不同的时间间隔执行某一函数,在一个特定的日期和时间。主要是儿童官方web应用程序和长时间运行的守护进程
  • Can gocron work with gin

    2020-12-01 22:33:40
    <div><p>I want to use gocron with gin router. But it seems that gin router and gocron block each other. If i start goncron before router.Run, the genData will be done, but can not get response from /...
  • go框架进阶——定时任务 goCron

    千次阅读 2019-08-16 14:41:09
    goCron是一个Golang作业调度工具,可以使用简单的语法定期执行go函数。 github:https://github.com/jasonlvhit/gocron api doc:https://godoc.org/github.com/jasonlvhit/gocron#Every 使用实例 package main...

    goCron是一个Golang作业调度工具,可以使用简单的语法定期执行go函数。

    github:https://github.com/jasonlvhit/gocron

    api doc:https://godoc.org/github.com/jasonlvhit/gocron#Every

    使用实例

    package main
    
    import (
    "fmt"
    "github.com/jasonlvhit/gocron"
    )
    
    func task() {
    	fmt.Println("I am runnning task.")
    }
    
    func taskWithParams(a int, b string) {
    	fmt.Println(a, b)
    }
    
    func main() {
    	//可并发运行多个任务
    	//注意 interval>1时调用sAPi
    	gocron.Every(2).Seconds().Do(task)
    	gocron.Every(1).Second().Do(taskWithParams, 1, "hi")
    	//在cron所有操作最后调用 start函数,否则start之后调用的操作无效不执行
    	//<-gocron.Start()
    
    	//在task执行过程中 禁止异常退出
    	gocron.Every(1).Minute().DoSafely(taskWithParams, 1, "hello")
    
    	// 支持在具体某一天、某天的某一时刻、每y-M-d h-m-s 执行任务
    	gocron.Every(1).Monday().Do(task)
    	gocron.Every(1).Thursday().Do(task)
    	// function At() take a string like 'hour:min'
    	gocron.Every(1).Day().At("10:30").Do(task)
    	gocron.Every(1).Monday().At("18:30").Do(task)
    
    	// 删除某一任务
    	gocron.Remove(task)
    
    	//删除所有任务
    	gocron.Clear()
    
    	//可同时创建一个新的任务调度 2个schedulers 同时执行
    	s := gocron.NewScheduler()
    	s.Every(3).Seconds().Do(task)
    	<-s.Start()
    
    	//防止多个集群中任务同时执行 task 实现lock接口
    	//两行代码,对cron 设置lock实现,执行task时调用Lock方法再Do task
    	gocron.SetLocker(lockerImplementation)
    	gocron.Every(1).Hour().Lock().Do(task)
    
    	<-gocron.Start()
    }

     

    源码浅析

     轻量 简洁的链式调用,看工程源码,简洁的……只有一个类。gocron当前支持最多1w个任务数,核心对象就是维护了job对象,所有执行的任务都放在jobs数组中,start方法底层调用go time包下的NewTicker,新启一个线程执行task方法。

    外部调用的gocron.start func调用链

    // Start all the pending jobs
    // Add seconds ticker
    func (s *Scheduler) Start() chan bool {
    	stopped := make(chan bool, 1)
    	ticker := time.NewTicker(1 * time.Second)
    
    	go func() {
    		for {
    			select {
    			case <-ticker.C:
    				s.RunPending()    //调用RunPending 执行数组有序的任务队列
    			case <-stopped:
    				ticker.Stop()
    				return
    			}
    		}
    	}()
    
    	return stopped
    }
    
    // RunPending runs all the jobs that are scheduled to run.
    func (s *Scheduler) RunPending() {
    	runnableJobs, n := s.getRunnableJobs()
    
    	if n != 0 {
    		for i := 0; i < n; i++ {
    			runnableJobs[i].run()
    		}
    	}
    }
    
    //run方法,反射获取job的各属性,最终调用function.call方法执行任务函数
    //Run the job and immediately reschedule it
    func (j *Job) run() (result []reflect.Value, err error) {
    	if j.lock {
    		if locker == nil {
    			err = fmt.Errorf("trying to lock %s with nil locker", j.jobFunc)
    			return
    		}
    		key := getFunctionKey(j.jobFunc)
    
    		if ok, err := locker.Lock(key); err != nil || !ok {
    			return nil, err
    		}
    
    		defer func() {
    			if e := locker.Unlock(key); e != nil {
    				err = e
    			}
    		}()
    	}
    
    	f := reflect.ValueOf(j.funcs[j.jobFunc])
    	params := j.fparams[j.jobFunc]
    	if len(params) != f.Type().NumIn() {
    		err = errors.New("the number of param is not adapted")
    		return
    	}
    	in := make([]reflect.Value, len(params))
    	for k, param := range params {
    		in[k] = reflect.ValueOf(param)
    	}
    	result = f.Call(in)
    	j.lastRun = time.Now()
    	j.scheduleNextRun()
    	return
    }
    

    这里需要关注一下,gocron对lock的实现,从代码上看Job结构体的lock属性,用于控制多实例job并发执行。但项目woner提到的 multiple instances 指的并不是跨服务器的多实例,而是在同一应用服务 里的多任务实例(也就是1个app服务中多个任务,粒度是只在统一应用内)。如果跨server则lock需要自行依赖redis或其他分布式锁来管理。通过读源码的run方法,j.lock来控制job并发,但一旦跨server job.lock属性是没法共享的。这里doc上给的解释有点歧义,需要注意。

    If you need to prevent a job from running at the same time from multiple cron instances (like running a cron app from multiple servers), you can provide a Locker implementation and lock the required jobs. 然后owner给出了一个基于redis来做的lock 

    Job结构体

    // Job struct keeping information about job
    type Job struct {
    	interval uint64                   // pause interval * unit bettween runs
    	jobFunc  string                   // the job jobFunc to run, func[jobFunc]
    	unit     string                   // time units, ,e.g. 'minutes', 'hours'...
    	atTime   time.Duration            // optional time at which this job runs
    	lastRun  time.Time                // datetime of last run
    	nextRun  time.Time                // datetime of next run
    	startDay time.Weekday             // Specific day of the week to start on
    	funcs    map[string]interface{}   // Map for the function task store
    	fparams  map[string][]interface{} // Map for function and  params of function
    	lock     bool                     // lock the job from running at same time form multiple instances
    }
    

    scheduler内维护JOBs array数组和大小,gocron scheduler最大可执行1w个job(大小可重写)。

    // Scheduler struct, the only data member is the list of jobs.
    // - implements the sort.Interface{} for sorting jobs, by the time nextRun
    type Scheduler struct {
    	jobs [MAXJOBNUM]*Job // Array store jobs ,const MAXJOBNUM = 10000
    	size int             // Size of jobs which jobs holding.
    }
    

    对于执行时间的控制,均通过对job的unit属性进行设置,代码如下

    // Seconds set the unit with seconds
    func (j *Job) Seconds() *Job {
    	return j.setUnit("seconds")
    }
    
    // Minutes set the unit with minute
    func (j *Job) Minutes() *Job {
    	return j.setUnit("minutes")
    }
    
    // Second set the unit with second
    func (j *Job) Second() *Job {
    	j.mustInterval(1)
    	return j.Seconds()
    }
    
    // Minute set the unit  with minute, which interval is 1
    func (j *Job) Minute() *Job {
    	j.mustInterval(1)
    	return j.Minutes()
    }
    
    // Sunday sets the job start day Sunday
    func (j *Job) Sunday() *Job {
    	return j.Weekday(time.Sunday)
    }
    
    // Every schedule a new periodic job with interval
    func (s *Scheduler) Every(interval uint64) *Job {
    	job := NewJob(interval)
    	s.jobs[s.size] = job
    	s.size++
    	return job
    }
    

    简单总结

    gocron代码总共570行,在java中但凡涉及到一点“通用工具”或“架构”的实现,除了多依赖之外,撸代码是少不了的。但在go中要实现满足基本功能的cron任务调度,没有多余依赖,纯基于gosdk本身,575行代码打完收工。这是在不接触go语言之前设想不到的事情。轻量好用,为中间件而生。

    编程语言跟人类沟通语言一样,属性都是工具,透过这个工具无论作为人或是工程师,给我们打开的是另一个世界和景象。在对比中扬长避短,可对比的资源越多,越是能找到最优方案。不怕不知道,就怕不知道。

    展开全文
  • linux安装gocron

    2019-06-06 14:05:31
    需64位,当前选择linux版本为例,压缩包下载请自行选择 //安装go环境 //查看是否安装过 go env //安装 yum install golang //压缩包下载地址 ...wget -c https://github.com/ouqiang/gocron/releases/downl...

    需64位,当前选择linux版本为例,压缩包下载请自行选择

    //安装go环境
    //查看是否安装过
    go env
    //安装
    yum install golang
    
    //压缩包下载地址
    https://github.com/ouqiang/gocron/releases
    
    //下载-调度器
    wget -c https://github.com/ouqiang/gocron/releases/download/v1.5.1/gocron-v1.5.1-linux-amd64.tar.gz
    
    //解压
    tar zxf gocron-v1.5.1-linux-amd64.tar.gz
    
    //进入目录
    cd gocron-linux-amd64/
    
    //调度器启动
    Windows: gocron.exe web
    Linux、Mac OS: ./gocron web
    ./gocron web
    
    //浏览器访问配置数据库,账户,编辑定时脚本
    http://localhost:5920
    
    

    执行方式是shell时,必须启动任务节点

    //下载-任务节点
    wget -c https://github.com/ouqiang/gocron/releases/download/v1.5.1/gocron-node-v1.5.1-linux-amd64.tar.gz
    
    //解压
    tar zxf gocron-node-v1.5.1-linux-amd64.tar.gz
    
    //进入目录
    cd gocron-node-linux-amd64/
    
    //任务节点启动, 默认监听0.0.0.0:5921
    Windows: gocron-node.exe
    Linux、Mac OS: ./gocron-node
    ./gocron-node
    
    展开全文
  • gocron1.5无法编译

    2021-01-08 04:12:34
    <div><p><img alt="qq 20180530133027" src="https://img-blog.csdnimg.cn/img_convert/ef8ffcadae56ef6c00c2a1c97cfd18f9.png" /></p>该提问来源于开源项目:ouqiang/gocron</p></div>
  • gocron - 使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab
  • gocron-定时任务管理系统 项目简介 使用Go语言开发的轻量级定时任务集中调度和管理系统,使用替代Linux-crontab 的原有任务延时为拆分项目独立 功能特性 Web界面管理定时任务 crontab时间表达式,精确到秒 任务执行...
  • 常见的go调度器有GitHub - ouqiang/gocron: 定时任务管理系统和GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) gocron结构如下: xxxl-jon: go的 是实现...
  • 官方文档 https://github.com/ouqiang/gocron#%E6%88%AA%E5%9B%BE ...gocron-v1.5.1-linux-amd64.tar.gz 解压 tar -zxvf gocron-v1.5.1-linux-amd64.tar.gz cd gocron-linux-amd64 ll gocron-linux-amd...
  • 使用dnnmmp安装mysql和phpmyadmin默认使用dnnmmp_default网络,因为在安装其他依赖mysql...原命令:docker run --name gocron --link mysql:db -p 5920:5920 -d ouqg/gocron 修改改命令: docker run --name gocron -...
  • 如何清除Gocron工作?

    2017-03-08 09:31:31
    <pre><code>func main() { ...<p>The running gocron job will break, but if my gocron job starts a second time later, it runs my function two times per minute. Where is my mistake? </div>
  • github地址:https://github.com/ouqiang/gocron/releases 安装部署: 分为两部分:server端,agent端 ...启动命令:./gocron web (默认端口为:5920) agent端启动: 解压开就一个二进制文件 ...
  • <p>I'm trying to stop the gocrons by killing the goroutine by closing the channel but I'm not able to stop gocron jobs. I am getting output <pre><code> doing job doing job doing job doing job ...
  • 下载执行文件的地址是:https://github.com/ouqiang/gocron/releases看清楚自己的系统,需要下载gocrongocron-node两个包,gocron是web配置平台,gocron-node是需要在想要执行任务的节点服务器部署的程序 ...
  • gocron源码中使用的是马卡龙框架,下面这个就是安装这个框架,和一般的MVC框架很像go get gopkg.in/macaron.v1git clone https://github.com/golang/crypto.git $GOPATH/src/golang.org/x/crypto 监听80端口,使用...
  • <p>I had a problem in a script using this package: <pre><code> "github....<p>Does anyone know how I can create a dynamic amount of gocron jobs without duplicating them? <p>Thanks :) </div>
  • 简介很多时候,项目中需要用到定时任务,或者周期任务。首先我们想到了 crontab,但是 crontab 使用会和项目分离,不那么方便。那怎么办呢?这里,推荐使用gocron 这个库,可以...
  • <div><p>看了一大圈任务调度,发现大神这个最轻量,很是喜欢。 刚安装了下,发现在添加节点的时候,发现没有可以填写用户的功能。 我们生产环境有很多是非root跑的...ouqiang/gocron</p></div>
  • gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}...) 首先在go语言中定义一个类型需要使用type 名字 struct{}...
  • Go1.11 开始,golang 官方支持了新的依赖管理工具go modgo mod download: 下载依赖的 module 到本地 cachego mod edit: 编辑 go.modgo mod graph: 打印模块依赖图go mod init: 在当前目录下初始化 go.mod(就是会...
  • 定时任务管理系统 gocron

    千次阅读 2018-06-25 14:13:36
    gocron - 定时任务管理系统 项目简介 使用Go语言开发的定时任务集中调度和管理系统, 用于替代Linux-crontab 查看文档 原有的延时任务拆分为独立项目延迟队列 功能特性 Web界面管理定时任务 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,305
精华内容 1,722
关键字:

gocron