在 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))
}
关于go - 改变 goroutine 休眠的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958579/