从 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()


森栏
浏览 84回答 1
1回答

小唯快跑啊

影响您要使用的解决方案的因素有很多。以下是在考虑如何继续之前需要回答的问题。您的图书馆如何运作?它是否同时执行作业,同时保持需要执行的作业的计划顺序?还是所有计划作业都在同一线程/goroutine 中执行?gocron您是否关心检索到的数据以何种顺序进行处理?是否需要按检索顺序处理它?是要立即处理数据,还是也在单独的计划作业中处理数据?数据处理所花费的时间是比两个计划作业之间的时间间隔的持续时间更多还是更少?下面是一个解决方案,其假设是计划程序不同时执行任务(某些库以这种方式工作),数据处理永远不会超过作业等待间隔的持续时间,并且需要按检索顺序处理数据。gocronqueryJob := Job{}dataCh := make(chan interface{})&nbsp;done := make(chan bool)queryJob.ClientID = clientidqueryJob.Topic = topicqueryJob.Range = rangequeryJob.Interval = intervalqueryJob.Task = func(s string, t string, dataCh chan<- interface{}){&nbsp; &nbsp; fmt.Println(s)&nbsp; &nbsp; fmt.Println(t)&nbsp; &nbsp; data, err := Query_by_limit(s, t)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; //handle error&nbsp; &nbsp; }&nbsp; &nbsp; dataCh <- data //if dataCh is an unbuffered channel, the job blocks here until the data is read in the data processing goroutine&nbsp; &nbsp;&nbsp;}//data processing goroutinego func() {&nbsp; for data := range dataCh {&nbsp; &nbsp; //process data&nbsp; }&nbsp; 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 emptiedclose(dataCh)<-done如果不想在数据处理 goroutine 中读取数据之前阻止作业,则可以将通道设置为缓冲通道。dataCh如果数据处理花费的时间比计划作业的等待间隔长,并且您仍然希望保持需要处理的数据的顺序,则解决方案会变得更加复杂。如果要在不同的计划作业中处理数据,情况也是如此。在这些情况下,我建议尝试使用队列来存储和维护其中数据顺序的解决方案,以及在程序退出之前实现排出队列并处理所有数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go