gocron 使用参数动态添加和删除任务

soo*_*oon 2 cron go

gocron在当前的项目中使用,遇到了一些文档中没有的情况。

我测试这段代码:

gocron.Every(3).Seconds().Do(taskWithParams,2,"world")
gocron.Every(2).Seconds().Do(taskWithParams,1, "hello")
gocron.Start()

time.Sleep(10 * time.Second)
gocron.Remove(taskWithParams)//<-- remove task
...

func taskWithParams(a int, b string) {
    fmt.Println(a, b)
}
Run Code Online (Sandbox Code Playgroud)

当我删除任务(gocron.Remove(taskWithParams))时,总是gocron.Every(3).Seconds().Do(taskWithParams,2,"world")被删除。即使我交换它们:

gocron.Every(2).Seconds().Do(taskWithParams,1, "hello")
gocron.Every(3).Seconds().Do(taskWithParams,2,"world")
Run Code Online (Sandbox Code Playgroud)

有没有办法让我明确指出我想要删除哪个任务,因为remove()只允许 1 argument

该文档还有一个scheduler

s := gocron.NewScheduler()
    s.Every(3).Seconds().Do(task)
    <- s.Start()
Run Code Online (Sandbox Code Playgroud)
  1. 什么时候是最佳用例scheduler
  2. 如果我们用完了调度程序,如何将其从内存中删除?做scheduler.Clear()这份工作吗?或者我们必须有另一种方法来将它们从内存中清除?

小智 8

您可以通过对函数处理程序进行重复数据删除来处理删除逻辑。

package main

import (
    "fmt"
)

func main() {
    fn1 := func() { taskWithParams(2, "world") }
    gocron.Every(3).Seconds().Do(fn1)
    fn2 := func() { taskWithParams(1, "hello") }
    gocron.Every(2).Seconds().Do(fn2)
    gocron.Start()

    time.Sleep(10 * time.Second)
    gocron.Remove(fn2)
}
func taskWithParams(a int, b string) {
    fmt.Println(a, b)
}
Run Code Online (Sandbox Code Playgroud)

否则,该方法将返回一个您可以传递给scheduler.Do的实例。*Jobscheduler.RemoveByReference

package main

import (
    "fmt"
)

func main() {

    job, err := gocron.Every(3).Seconds().Do(taskWithParams, 2, "ww")
    if err != nil {
        panic(err)
    }
    gocron.Every(2).Seconds().Do(taskWithParams, 1, "hh")
    gocron.Start()

    time.Sleep(10 * time.Second)
    gocron.RemoveByReference(job)
}
func taskWithParams(a int, b string) {
    fmt.Println(a, b)
}
Run Code Online (Sandbox Code Playgroud)