去常规的奇怪行为

Zhe*_*hen 0 concurrency go goroutine

我只是尝试了下面的代码,但结果似乎有点奇怪.它首先打印奇数,然后打偶数.我真的很困惑.我原本希望它输出奇数和偶数一个接一个,就像1,2,3,4 ...... 谁能帮我?

package main

import (
    "fmt"
    "time"
)

func main() {
    go sheep(1)
    go sheep(2)
    time.Sleep(100000)
}

func sheep(i int) {
    for ; ; i += 2 {
        fmt.Println(i,"sheeps")
    }
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*all 6

您很可能只使用一个cpu线程运行.所以它运行第一个goroutine然后第二个.如果你告诉它可以在多个线程上运行,那么两者都可以同时运行,前提是os在cpu上有空闲时间.您可以在运行二进制文件之前通过设置GOMAXPROCS = 2来证明这一点.或者您可以尝试在绵羊函数中添加runtime.Gosched()调用,看看是否触发运行时允许其他goroutine运行.

一般情况下,除非您使用sync.Mutex指定特定的同步点或在通道之间进行通信,否则最好不要假设两个goroutine中的操作之间的排序语义.