为什么golang CronJob不能在goroutine内运行?

我每天使用CronJob来启动我的任务,我的任务有几个子任务,我计划使用goroutine来运行。但是,事情并不顺利。


文件框架


|-gpool

|  -pool.go

|-main.go

main.go


import (

        "code.byted.org/i18n_web/content_import_tool_cronJob/gpool"

        "fmt"

        "github.com/robfig/cron/v3"

        "log"

        "os"

        "runtime"

        "time"

    )

    

    func SeedJob(it string, pool *gpool.Pool){

        fmt.Println("Name item: ", it)

        println(runtime.NumGoroutine())

        pool.Done()

    }

    

    type delayJob struct {

        PagePatternNameList []string

    }

    

    func (j *delayJob) GetPagePatternNameList() {

        //j.PagePatternNameList = dal.GetPagePatternName()

        j.PagePatternNameList = []string{"atama_posts","cchan_posts", "cookdoor_posts", "cookpad_posts",

            "cookpad_recipe_seed", "kurashiru_posts", "lips_all_posts", "lips_product", "lips_product_sku_seed",

            "lips_rank", "press_posts", "voce_all_posts", "zozo_posts_women"}

    }

    

    func (j *delayJob)Run(){

        log.Println("delay Job RUN")

        //time.Sleep(2 * time.Second)

        // startSeedJob

        pool := gpool.New(10)

        println(runtime.NumGoroutine())

        for _, it := range j.PagePatternNameList {

            pool.Add(1)

            go SeedJob(it, pool)

        }

        pool.Wait()

        println(runtime.NumGoroutine())

    }

    

    func main() {

        c := cron.New(

            cron.WithLogger(

                cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))))

    

        _, err := c.AddJob("CRON_TZ=America/New_York @every 2m", cron.NewChain(cron.DelayIfStillRunning(cron.DefaultLogger)).Then(&delayJob{}))

        if err != nil {

            fmt.Println("Cron Job err!")

            return

        }

        fmt.Println("it started")

        c.Start()

    

        defer c.Stop()

    

        time.Sleep(time.Second * 5)

    

    }


慕尼黑5688855
浏览 97回答 1
1回答

九州编程

它没有运行,因为您计划作业每 2 分钟运行一次,然后只等待 5 秒,然后您从中返回,从而导致程序退出。main()如果要在后台启动此 cron,则必须使程序运行足够长的时间,以便它运行并完成,在本例中至少超过 2 分钟。如果您没有其他事情要做,那么您可以考虑使用而不是 。main()c.Run()c.Start()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go