中断睡觉的goroutine?

时间:2014-04-28 01:55:30

标签: go

有没有办法可以执行,例如

time.Sleep(time.Second * 5000) //basically a long period of time

然后在我愿意的时候“唤醒”睡觉的goroutine?

我看到Reset(d Duration)中有一个Sleep.go,但我无法调用它......有什么想法吗?

1 个答案:

答案 0 :(得分:18)

无法中断time.Sleep,但是,您可以使用time.Afterselect语句来获取您正在使用的功能。

显示基本想法的简单示例:

package main

import (
    "fmt"
    "time"
)

func main() {
    timeoutchan := make(chan bool)

    go func() {
        <-time.After(2 * time.Second)
        timeoutchan <- true
    }()

    select {
    case <-timeoutchan:
        break
    case <-time.After(10 * time.Second):
        break
    }

    fmt.Println("Hello, playground")
}

http://play.golang.org/p/7uKfItZbKG

在这个例子中,我们正在产生一个信号goroutine告诉main停止暂停。主要是等待和聆听两个频道,timeoutchan(我们的信号)和time.After返回的频道。当它在这些通道中的任何一个上接收时,它将跳出选择并继续执行。