go - 改变 goroutine 休眠的时间

标签 go process sleep goroutine

Go 中,我可以编写这样的代码来创建休眠 5 秒的 gorouting。

func sleep(link chan interface{}){
    time.Sleep(5 * time.Second)
    fmt.Println("I've slept for 5 sec")
    link <- struct {}{}
}

func main() {
    var link = make(chan interface{})
    go sleep(link)
    time.Sleep(1 * time.Second)
    // here I want to change the remaining sleeping time of `sleep` goroutine to 0.5 sec
    <- link
}

如果在 main 函数中我改变主意并决定 sleep 者应该睡 5 秒而不是 3 会怎样?如果 goroutine 已经开始休眠(并且休眠,例如 1 秒)怎么办?

更新

我的意思是,是否有东西让我可以在它休眠时管理那个独特的 goroutine。比如向它发出减少或增加 sleep 时间的命令:

func main() {
    // ...
    time.Sleep(1)
    something.ManageRemainingTime(10)
    time.Sleep(5)
    something.ManageRemainingTime(100)
    time.Sleep(8)
    something.ManageRemainingTime(0.5)
    // ...
}

最佳答案

如果您只需要一种方法来“唤醒”休眠的 goroutine,您可以使用 sync.Once 来确保您的函数只被调用一次,然后返回一个 channel 以便您可以更快地设置“触发时间”,所以是这样的:

func sleep(callback func(), seconds int) chan int {
    once := sync.Once{}
    wakeup := make(chan int)
    go func() {
        for sleep := range wakeup {
            go func() {
                time.Sleep(time.Duration(sleep) * time.Second)
                once.Do(callback)
            }()
        }
    }()
    wakeup <- seconds
    return wakeup
}


func main() {
        wg := sync.WaitGroup{}
        wg.Add(1)
        t := time.Now()
        wakeup := sleep(func() {
            fmt.Println("Hello, playground")
            wg.Done()
        }, 5)
        wakeup <- 2
        wg.Wait()
        fmt.Println(time.Since(t))
}

https://play.golang.org/p/BRNtaBPKpLW

关于go - 改变 goroutine 休眠的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958579/

相关文章:

google-app-engine - GAE (go) 推送队列率未强制执行

go - 使用 os.O_CREATE 时读取默认 FileMode

c - 通过杀死其父进程而成为孤儿的子进程不会被 init 收养。我该如何解决?

c - 在 Linux 中从 C 杀死所有进程

android - 如何在 Android onClick 函数中设置延迟

当我不主动使用计算机时,R 脚本停止运行

go - 解码 yaml 不正确?

go - 在推断出 GOPATH 时运行(安装)go 代码

memory-management - 差异交换和分页

c# - 为什么 Thread.Sleep() 会卡住表单?