在C#中,当我们想在两个过程的执行之间造成延迟时,我们有两个选择:
Thread.Sleep(time)
正在阻塞await Task.Delay(time)
非阻塞
换句话说,Thread.Sleep(time)
在指定时间内阻止当前线程,而await Task.Delay(time)
挂起正在执行的线程(允许OS线程计划程序选择和运行更多线程),然后在指定时间后恢复它。
在Go中,有一个time.Sleep(time)
方法,它被称为阻塞方法。作为Go的新手,我有这个问题,假设我有一千个go例程(因为go有自己的线程调度器,而不是依赖于OS调度器,这应该不是问题),我想在这些go例程中的每一个中实现一个重试模式,以这样的方式:
FOR 5 Times {
IF Request Fails
THEN
time.Sleep(time.Second * 30)
ELSE
RETURN
}
在这种情况下使用time.Sleep(time)
安全吗?还是有更好的办法?
编辑:我不是在问time.Sleep(time)
是否阻塞!!我不知道为什么我的问题是重复的职位!
2条答案
按热度按时间mklgxw1f1#
Go中没有async/await。要实现非阻塞睡眠,你必须将其 Package 在一个goroutine中。然后,它可以使用通道消息将其结果返回到主上下文。
e4yzc0pl2#
如果你想让goroutine等待一段特定的时间,
time.Sleep
是最好、最正确的方法。Sleep将当前goroutine暂停至少持续时间d