Select 围棋:暂停一场比赛
我有以下代码:Select 围棋:暂停一场比赛,select,go,goroutine,Select,Go,Goroutine,我有以下代码: package main import ( "fmt" "time" ) func main() { ws := make(chan int) go looper(ws) time.Sleep(3 * time.Second) ws <- 0 time.Sleep(3 * time.Second) ws <- 1 time.Sleep(3 * time.Second) } func loop
package main
import (
"fmt"
"time"
)
func main() {
ws := make(chan int)
go looper(ws)
time.Sleep(3 * time.Second)
ws <- 0
time.Sleep(3 * time.Second)
ws <- 1
time.Sleep(3 * time.Second)
}
func looper(ws chan int) {
i := 0
state := 1
for {
time.Sleep(1) // COMMENT OUT?
select {
case state = <- ws:
fmt.Println("State changed!")
default:
if state == 1 {
fmt.Println("Current: ", i)
i++
}
}
}
}
我的问题是:为什么,如果我注释掉time.Sleep(1)
内for
循环,程序会打印以下内容:
Current: 0
...
Current: X
State changed!
然后永不放弃陷入循环,甚至没有进入
ws-weird,试图注释/取消注释那一行,都得到了2个“状态更改!”您的代码按预期工作。您使用的是什么版本的Go?您将GOMAXPROC设置为什么?如果您要进行实质上繁忙的循环,则至少需要GOMAXPROCS=2才能可靠地安排它。@JimB谢谢,我将尝试在家中更改此值。我猜您也在使用旧版本的go,因为选择应该提供更多的抢占点。通过使用runtime.Gosched()
@JimBruntime.Gosched()
将1纳秒睡眠替换为1纳秒睡眠,您可以使当前运行的更加可靠。再次感谢你!奇怪,试图注释/取消注释该行,两人都得到2“状态已更改!”您的代码按预期工作。您使用的是什么版本的Go?您将GOMAXPROC设置为什么?如果您要进行实质上繁忙的循环,则至少需要GOMAXPROCS=2才能可靠地安排它。@JimB谢谢,我将尝试在家中更改此值。我猜您也在使用旧版本的go,因为选择应该提供更多的抢占点。通过使用runtime.Gosched()
@JimBruntime.Gosched()
将1纳秒睡眠替换为1纳秒睡眠,您可以使当前运行的更加可靠。再次感谢你!
Current: 0
...
Current: X
State changed!