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()
@JimB
runtime.Gosched()
将1纳秒睡眠替换为1纳秒睡眠,您可以使当前运行的更加可靠。再次感谢你!奇怪,试图注释/取消注释该行,两人都得到2“状态已更改!”您的代码按预期工作。您使用的是什么版本的Go?您将GOMAXPROC设置为什么?如果您要进行实质上繁忙的循环,则至少需要GOMAXPROCS=2才能可靠地安排它。@JimB谢谢,我将尝试在家中更改此值。我猜您也在使用旧版本的go,因为选择应该提供更多的抢占点。通过使用
runtime.Gosched()
@JimB
runtime.Gosched()
将1纳秒睡眠替换为1纳秒睡眠,您可以使当前运行的更加可靠。再次感谢你!
Current: 0
...
Current: X
State changed!