Google Go Goroutine的中断模式(速度问题)
我运行一个goroutine来增加一个计数器,该计数器可以被命令行输入“ t \ n”打断
在该select
语句中,如果我选择使用default:
,则计数器变量会j
飞到前言。对我来说这很正常。
但是,如果我选择使用case
<-time.After(100*time.Microsecond):,则计数器j
在一秒内最多只能增加60个左右,而不是10,000个。
实际上,无论我输入什么值time.After()
,在select
声明中我只能得到大约60Hz的频率。
为什么?
package mainimport (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
message := make(chan string)
go check_input(message)
work_loop(message)
}
func work_loop(message chan string) {
//var j [][]int
var j int
t0:=time.Now()
Loop:
for {
select {
case msg := <-message:
if msg == "terminate" {
//fmt.Println("end task")
t1:=time.Now()
fmt.Println(j)
fmt.Println("total duration:", t1.Sub(t0))
break Loop
}
case <-time.After(100 * time.Microsecond):
//default:
//do work here
j += 1
fmt.Println(j)
break
}
}
//fmt.Println("exit work loop")
}
func check_input(msg chan string) {
reader := bufio.NewReader(os.Stdin)
for {
line, err := reader.ReadString('\n')
if err != nil {
// You may check here if err == io.EOF
break
}
if strings.TrimSpace(line) == "t" {
msg <- "terminate"
}
}
}
回答:
它与的精度有关time.Timer
。查看以下文档time.After
:
[…]等效于NewTimer(d).C。
以及以下文件time.NewTimer
:
NewTimer创建一个新的Timer,它将 持续时间d 之后 其通道上发送当前时间。
(强调我的)
这样做的原因是NewTimer
委托给运行时(与OS相关)计时器,使此计时器的行为取决于基础OS(以及Go集成的实现)。
通常,根据我的经验,亚毫秒级粒度在任何语言中都没有良好的跨平台支持, 尤其是 在Windows XP上。
以上是 Google Go Goroutine的中断模式(速度问题) 的全部内容, 来源链接: utcz.com/qa/405753.html