Go语言 围棋无阻塞睡眠

33qvvth1  于 2023-06-27  发布在  Go
关注(0)|答案(2)|浏览(106)

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

  1. Thread.Sleep(time)正在阻塞
  2. 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)是否阻塞!!我不知道为什么我的问题是重复的职位!

mklgxw1f

mklgxw1f1#

Go中没有async/await。要实现非阻塞睡眠,你必须将其 Package 在一个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
}
e4yzc0pl

e4yzc0pl2#

如果你想让goroutine等待一段特定的时间,time.Sleep是最好、最正确的方法。
Sleep将当前goroutine暂停至少持续时间d

相关问题