在一段时间内将整个函数放在一个无限循环中更有效吗?在结束时休眠还是循环一个go例程?

在一段时间内将整个函数放在一个无限循环中更有效吗?在结束时休眠还是循环一个go例程?,go,Go,我现在有一个函数,我想每隔20秒左右轮询一次,它在go例程中调用,如下所示: go StartTradeBot() 然后在函数体中: func StartTradeBot() { for { // All the stuff to do time.Sleep(20 * time.Second) } } 这样效率更高吗 或者我应该像这样把我的goroutine包起来 for { go StartTradeBot() time.Sle

我现在有一个函数,我想每隔20秒左右轮询一次,它在go例程中调用,如下所示:

go StartTradeBot()

然后在函数体中:

func StartTradeBot() {
    for {
        // All the stuff to do
        time.Sleep(20 * time.Second)
    }
}
这样效率更高吗

或者我应该像这样把我的goroutine包起来

for {
    go StartTradeBot()
    time.Sleep(20 * time.Second)
}

关于如何做到这一点,至少有三种变体,每种变体都具有不同的功能。由于间隔为20秒,因此性能差异可以忽略不计。选择最能满足应用程序功能需求的变体

选项1:每次操作之间暂停20秒

for {
    // Do stuff
    time.Sleep(20 * time.Second)
}
选项2:每20秒启动一次操作,即使之前的操作仍在执行

for {
   go func() {
      // Do stuff
   }()
   time.Sleep(20 * time.Second)
}
选项3:每20秒或前一次操作完成后开始操作,以较晚者为准

t := time.NewTicker(20 * time.Second)
for range t.C {
   // Do stuff
}

这类问题相当主观,而且会引起固执己见的回答。也就是说,我的意见是,你的函数应该按照它在盖子上写的那样做,如果你在运行bot之间需要睡眠,调用方应该等待,而不是
StartTradeBot()
函数。@A这是否意味着调用goroutine的第二部分将是你的首选?是的。它使
StartTradeBot
函数无需内置休眠调用即可重用。也就是说,除非你总是想在调用bot函数时睡觉。@AaronD是的,这只是一个调查,看看是否有交易是活跃的,而且它一直在运行。这两种交易做的事情不同。第一个是。。。等待,直到完成,然后等待20秒,第二个启动。。。异步,每20秒一次。但前一个可能仍在执行。如果你想像你写的那样每20秒轮询一次,我会做:
范围时间。勾选(20*time.Second){//do stuff}