Time 基于时间编写睡眠函数

Time 基于时间编写睡眠函数,time,go,sleep,channel,Time,Go,Sleep,Channel,编辑:我的问题与之不同,它有一个不同的代码变体,没有单独的原因,我需要解释原因 我试图在这里解决家庭作业问题:(使用time.After编写自己的睡眠函数) 以下是我迄今为止根据该章中讨论的示例所做的尝试: package main import ( "fmt" "time" ) func myOwnSleep(duration int) { for { select { case

编辑:我的问题与之不同,它有一个不同的代码变体,没有单独的原因,我需要解释原因

我试图在这里解决家庭作业问题:(使用
time.After
编写自己的睡眠函数)

以下是我迄今为止根据该章中讨论的示例所做的尝试:

package main

import (
        "fmt"
        "time"
)

func myOwnSleep(duration int) {
        for {
                select {
                case <-time.After(time.Second * time.Duration(duration)):
                        fmt.Println("slept!")
                default:
                        fmt.Println("Waiting")
                }
        }
}

func main() {
        go myOwnSleep(3)

        var input string
        fmt.Scanln(&input)
}
主程序包
进口(
“fmt”
“时间”
)
func myownseep(持续时间int){
为了{
挑选{

case在
for
循环的每次迭代中,执行
select
语句,该语句涉及对通道操作数的求值

在每次迭代中,都会调用
time.After()
,并创建一个新频道

如果持续时间超过
0
,则此频道未准备好接收,因此将执行默认情况。此频道不会再次测试/检查,下一次迭代将创建一个新频道,该频道将再次未准备好接收,因此将一如既往地再次选择
默认情况

解决方案非常简单,但如图所示:


请注意,在从通道接收到值之前,此函数不会“休息”,只会无情地执行代码-加载一个CPU核心。如果只有一个CPU核心可用(),这甚至会给您带来麻烦,其他goroutine(包括将(或将)在通道上发送值的goroutine)可能会被阻止并且永远不会执行。睡眠(例如
time.sleep(time.millis秒)
)可能会使CPU内核不再执行无休止的工作(并允许其他goroutine运行).

相关:是的,我试图在那里对我的代码版本进行评论,但没有足够的代表:)谢谢你的输入!我刚刚尝试删除了
for
循环(),你能解释一下为什么它仍然停留在
等待
,而没有进入频道完成案例吗?我怎么做频道谈话的“倾听事件”?啊,在你链接到的另一个答案中,这一行确实有助于澄清它:“所以只需从返回的频道接收一个值,接收将阻止,直到发送该值:”(我仍然不介意回答上面评论中的问题)@请原谅,我看到了编辑过的答案。我包括了如何修复你的函数。是的!这个返回带来了所有的不同。感谢你对单线程机器的谨慎;在VMs上运行类似的代码之前,我会小心的!
func Sleep(sec int) {
    <-time.After(time.Second* time.Duration(sec))
}
func myOwnSleep(duration int) {
    ch := time.After(time.Second * time.Duration(duration))
    for {
        select {
        case <-ch:
            fmt.Println("slept!")
            return // MUST RETURN, else endless loop!
        default:
            fmt.Println("Waiting")
        }
    }
}