登录
首页 >  Golang >  Go问答

非阻塞休眠在 Go 中的应用

来源:stackoverflow

时间:2024-02-09 14:18:24 105浏览 收藏

本篇文章向大家介绍《非阻塞休眠在 Go 中的应用》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

在 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
}

到这里,我们也就讲完了《非阻塞休眠在 Go 中的应用》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>