如何有效停止Gocron工作?

时间:2018-07-18 11:24:42

标签: go cron

我正在做这样的事情:

package main

import (
    "fmt"
    "time"

    "github.com/jasonlvhit/gocron"
)

func jobs(quit <-chan bool) {
    for {
        select {
        case <-quit:
            return
        default:
            //cron jobs
            g := gocron.NewScheduler()
            g.Every(1).Second().Do(stuff)
            <-g.Start()
        }
    }
}

func stuff() {
    fmt.Println("doing job")
}

func main() {
    q := make(chan bool)
    go jobs(q)
    time.Sleep(3 * time.Second)

 //to quit the goroutine
    q <- true    
    close(q)
    fmt.Println("main")
}

我正在尝试通过关闭渠道杀死goroutine来停止gocrons,但我无法停止gocron作业。我正在输出

            doing job
            doing job
            doing job
            doing job
            doing job
            doing job
            doing job
            .
            .

代替

            doing job
            doing job
            doing job
            main

我在做什么错?有没有更好的解决方案来停止Gocron作业?

1 个答案:

答案 0 :(得分:2)

您的问题在此处的选择框中:

    select {
    case <-quit:
        return
    default:
        //cron jobs
        g := gocron.NewScheduler()
        g.Every(1).Second().Do(stuff)
        <-g.Start()
    }

这段代码说:选择我们可以从quit中读取的大小写并退出,或者执行默认大小写。

输入案例的default部分将阻塞<-g.Start()上的goroutine,直到完成所有作业为止。我们必须在这里等待工作完成。在我们仍在等待<-g.Start()的同时,我们不考虑quit频道。

代替:

func jobs(quit <-chan bool) {
    for {
        //cron jobs
        g := gocron.NewScheduler()
        g.Every(1).Second().Do(stuff)

        select {
        case <-quit:
            // here we receive from quit and exit
            // if `g` has started, we may want to `g.Clear()`
            // or the scheduled jobs will continue, we will just not be waiting for them to finish.
            return
        case <-g.Start():
            // here we know all the jobs are done, and go round the loop again
        }
    }
}