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")
}
}
}