go中的非阻塞睡眠

  • 本文关键字:go go goroutine
  • 更新时间 :
  • 英文 :


在c#中,当我们想在两个过程的执行之间造成延迟时,我们有两个选择:

  1. Thread.Sleep(time)阻塞
  2. await Task.Delay(time)非阻塞

Thread.Sleep(time)阻塞当前线程指定时间,await Task.Delay(time)挂起执行(允许操作系统线程调度程序选择并运行更多线程),然后在指定时间后恢复。

在Go中,有time.Sleep(time)方法,这是一个已知的阻塞方法。作为Go的新手,我有这个问题,假设我有一千个Go例程(因为Go有自己的线程调度器,而不是依赖于操作系统调度器,这应该不是问题),我想在这些Go例程中的每一个中实现一个重试模式,以这样的方式:

FOR 5 Times {
IF Request Fails 
THEN
time.Sleep(time.Second * 30)
ELSE
RETURN
}

在这种情况下使用time.Sleep(time)是否安全?还是有更好的办法?

编辑:我不是在问time.Sleep(time)是否阻塞!!我不知道为什么我的问题是重复的那篇文章!

go中没有async/await。要想有一个无阻塞的睡眠,你必须把它包装在一个goroutine中。然后,它可以使用通道消息将其结果返回给主上下文。

// create a channel to receive the return value of an asynchronous function
channel := make(chan bool)
// this is a goroutine which executes asynchronously
go func() {
time.Sleep(5 * time.Second)
// send a message to the channel
channel <- true
}()
// setup a channel listener
select {
case val: <-channel:
// Execute some code after a timeout, val contains the sent value
}

如果你想让一个程序等待一段特定的时间,time.Sleep是最好的,最正确的方法。

Sleep暂停当前例程至少持续时间d

相关内容

  • 没有找到相关文章

最新更新