登录
首页 >  Golang >  Go问答

从 gocron 任务中获取结果

来源:stackoverflow

时间:2024-02-22 18:24:25 500浏览 收藏

今天golang学习网给大家带来了《从 gocron 任务中获取结果》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我使用 gocron 作为我的调度程序,它运行匿名函数:

j := Job{}
j.ClientID = clientid
j.Topic = topic
j.Range = range
j.Interval = interval
j.Task = func(s string, t string){
    fmt.Println(s)
    fmt.Println(t)
    Query_by_limit(s, t)// <-- data wanted
}

gocron.Every(j.Interval).Seconds().Do(j.Task, j.Topic, j.Range)
gocron.Start()

如何在 query_by_limit() 每次到达时捕获数据并将其发送进行处理?


解决方案


有很多因素可能会影响您想要采用的解决方案。在考虑如何继续之前,需要回答以下问题。

  • 您的 gocron 库如何工作?它是否同时执行作业,同时保持需要执行的作业的预定顺序?或者所有计划的作业都在同一个线程/goroutine 中执行吗?
  • 您关心检索到的数据的处理顺序吗?是否需要按照检索的顺序进行处理?
  • 您想要立即处理数据还是在单独的计划作业中进行?
  • 数据处理所花费的时间比两个计划作业之间的间隔时间长还是短?

这是一个解决方案,假设调度程序没有同时执行任务(某些 gocron 库以这种方式工作),数据处理永远不会超过作业等待间隔的持续时间,并且需要处理数据按照检索的顺序。

queryJob := Job{}
dataCh := make(chan interface{}) 
done := make(chan bool)
queryJob.ClientID = clientid
queryJob.Topic = topic
queryJob.Range = range
queryJob.Interval = interval
queryJob.Task = func(s string, t string, dataCh chan<- interface{}){
    fmt.Println(s)
    fmt.Println(t)
    data, err := Query_by_limit(s, t)
    if err != nil {
      //handle error
    }
    dataCh <- data //if dataCh is an unbuffered channel, the job blocks here until the data is read in the data processing goroutine
    
}

//data processing goroutine
go func() {
  for data := range dataCh {
    //process data
  }
  done <-true
}()

gocron.Every(j.Interval).Seconds().Do(j.Task, j.Topic, j.Range, dataCh)
gocron.Start()
//when scheduler exits, you can close dataCh and give it a chance to be emptied
close(dataCh)
<-done

如果您不想在数据处理 goroutine 中读取数据之前阻塞作业,可以将 datach 通道设置为缓冲通道。

如果数据处理时间比计划作业的等待间隔长,并且您仍然希望保持需要处理的数据的顺序,则解决方案会变得更加复杂。如果您想在不同的计划作业中处理数据,情况也是如此。在这些情况下,我建议尝试使用队列来存储和维护数据顺序的解决方案,以及在程序退出之前实现排空队列并处理所有数据。

好了,本文到此结束,带大家了解了《从 gocron 任务中获取结果》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>