【发布时间】:2021-07-21 11:34:26
【问题描述】:
问题
如何让下面的代码在 3 秒后打印“QUIT”?
代码
package main
import (
"fmt"
"time"
)
func main() {
quit := make(chan struct{})
tasks := make(chan struct{})
go func(){
time.Sleep(1 * time.Second)
tasks <- struct{}{}
}()
go func(){
time.Sleep(3 * time.Second)
quit <- struct{}{}
}()
for {
select {
case <-quit:
fmt.Println("QUIT")
return
case <-tasks:
fmt.Println("Doing")
// do some long time jobs more than 10 seconds
time.Sleep(10 * time.Second)
}
}
}
观察
上面的代码打印出“Doing”。并休眠 10 秒,然后打印“QUIT”。
如何中断这个睡眠,让它在3秒后接收quit频道并打印“QUIT”?
好像select被case tasks屏蔽了,3秒后就收不到quit频道了。
【问题讨论】:
-
删除
return -
select 似乎被 case 任务阻塞了 不,程序刚结束,你回来了。
-
如何中断这个睡眠 - 你想在这里解决什么问题? “杀死”一个阻塞操作?
-
如何让它在3秒后退出?我已经更新了这个问题。
-
假设
case tasks内部有一个耗时的工作,超过10秒,那么当我发送quit频道信号时如何中断这个工作?