首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >更改goroutine睡眠时间

更改goroutine睡眠时间
EN

Stack Overflow用户
提问于 2018-06-21 07:54:00
回答 1查看 1.3K关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
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函数中,我改变主意,决定休眠的不是5 sec,而是3,该怎么办?如果goroutine已经开始休眠(例如,休眠了1秒),该如何处理?

更新

我是说,有没有什么办法可以让我在那只独一无二的大猩猩休眠的时候管理它。就像向它发出关于减少或增加睡眠时间的命令:

代码语言:javascript
代码运行次数:0
运行
复制
func main() {
    // ...
    time.Sleep(1)
    something.ManageRemainingTime(10)
    time.Sleep(5)
    something.ManageRemainingTime(100)
    time.Sleep(8)
    something.ManageRemainingTime(0.5)
    // ...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 08:28:47

如果你只需要一种方法来“唤醒”一个休眠的goroutine,你可以使用sync.Once来确保你的函数只被调用一次,然后返回一个通道,这样你就可以设置一个更早的“触发时间”,所以如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50958579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档