Go 除了在围棋中使用睡眠,还有更好的选择吗

Go 除了在围棋中使用睡眠,还有更好的选择吗,go,sleep,goroutine,thread-sleep,Go,Sleep,Goroutine,Thread Sleep,我想写一个每1小时做一份工作的工人。到目前为止,我们的系统中还没有cron,所以不想添加cron。在以下实施过程中征求建议: func init(){ go startWorker() } func startWorker(){ doJob() time.Sleep(time.Second * 3600) } 在日常生活中使用睡眠是一个坏主意,还是有更好的替代方法来做这些事情。 doJob()的任务是从数据库中提取过去一小时内发生的所有故障,然后重试使用时间有两

我想写一个每1小时做一份工作的工人。到目前为止,我们的系统中还没有cron,所以不想添加cron。在以下实施过程中征求建议:

func init(){
     go startWorker()
}

func startWorker(){
     doJob()
     time.Sleep(time.Second * 3600)
}
在日常生活中使用睡眠是一个坏主意,还是有更好的替代方法来做这些事情。
doJob()
的任务是从数据库中提取过去一小时内发生的所有故障,然后重试使用
时间有两个问题。按照您想象的方式睡眠,一个主要问题和一个次要问题

你没有办法结束这场狂欢 goroutine被困在一个无限循环中,因此除非
doJob
恐慌,否则它永远不会终止。您可能应该向其传递一个通道,当goroutine需要终止时,该通道将关闭:

done:=make(chan结构{})
go worker(完成)
...
结束(完成)
...

func工人(完成使用a,这就是它的用途。这回答了你的问题吗?你也可以使用
context.context
而不是显式的
done
频道。我没有发现
context
特别有用,但可能我错了。不确定你是如何使用上下文的,但如果它使用正确,它们会非常有用。This-specific case是一个教科书上的例子,说明上下文在哪里工作得很好。函数变成
func-worker(ctx-context.context)
案例变成了
case我了解如何使用上下文。我不了解的是使用上下文在一个裸通道上为你带来了什么,除非在少数情况下你实际上正在构建一个上下文树。但是使用嵌套上下文并不是一件稀罕事——它经常被使用。即使不是这样,它也会抽象出一些复杂性也没有理由在代码中再次实现相同的东西,特别是当您想要使用接受上下文的lib时。