concurrency - go 例程的奇怪行为

标签 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")
    }
}

最佳答案

您很可能只使用一个 CPU 线程运行。所以它运行第一个 goroutine,然后运行第二个。如果你告诉 go 它可以在多个线程上运行,那么只要 os 在 cpu 上有空闲时间就可以同时运行。您可以通过在运行二进制文件之前设置 GOMAXPROCS=2 来演示这一点。或者您可以尝试在您的 sheep 函数中添加一个 runtime.Gosched() 调用,看看是否会触发运行时以允许另一个 goroutine 运行。

一般来说,最好不要假定两个 goroutine 中的操作之间的排序语义,除非您使用 sync.Mutex 指定特定的同步点或在它们之间通过 channel 进行通信。

关于concurrency - go 例程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11211237/

相关文章:

go - 试图理解 goroutines

go - 如何在 lambda 处理程序回复后等待 goroutine 完成

java - 单例 Bean 上的 Spring @Async

go - 阅读 channel 的不同方式

Java 迭代器并发

java - 并发方法设计的数据类型

node.js - 使用 RSA 验证和签署从 NodeJS 到 Golang 的 JSON Web token ,反之亦然?

database - 是否可以在 GAE Golang Blobstore 中存储任意数据?

docker - 如何在Docker容器中连接到交互式进程

go - 当 channel 关闭时,以接收 channel 作为参数的 goroutines 是否停止?