Goroutines不能并行工作

时间:2015-07-08 06:39:20

标签: go parallel-processing goroutine

给出以下代码:

package main

import (
    "fmt"
    "runtime"
    "time"
)


func f(from string) {

    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
        //runtime.Gosched()
    }
}

func main() {

    runtime.GOMAXPROCS(runtime.NumCPU()*2)
    time.Sleep(100)

    go f("i am not parallel")

    go f("neither me")

    var input string
    fmt.Scanln(&input)
}

大多数情况下的输出是:

  

我不平行:0
  我不平行:1
  我不平行:2
  不是我:0
  不是我:1   不是我:2

有时候:

  

我都不是:0
  不是我:1   不是我:2
  我不平行:0
  我不平行:1
  我不平行:2

runtime.Gosched()取消注释时,一切似乎都没问题。 我已经尝试将GOMAXPROCS编号从2更改为NumCPU,goroutines的数量,周期:没有可以让它并行工作。
为什么这么奇怪的行为?

修改 好吧,似乎是上下文切换是繁重的工作,并且在没有合理问题的情况下不经常进行。我仍然无法理解的一件事 - 为什么人们get it to work没有任何睡眠指示?

1 个答案:

答案 0 :(得分:0)

你不应该预测goroutine时间表。通过运行您提供的示例,我得到了此输出。

direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine : 1
goroutine : 2
going
done

如果我在主函数的开头添加runtime.GOMAXPROCS(4),并在我的i5 Qcore桌面ubuntu上运行它,则输出

direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine : 1
goroutine : 2
going

done

我认为并不总是产生相同的输出。所以我们应该假设goroutine可以并行,如果你需要控制序列,就加上锁定。