【问题标题】:Go Worker Pool doesn't seem to be processing ConcurrentlyGo Worker Pool 似乎没有同时处理
【发布时间】:2015-10-09 00:02:15
【问题描述】:

您好,我是新手(一般是并发编程 :() 并试图将缓慢的计算分配给工作人员池。

http://play.golang.org/p/lTv4Tm75A4

func main() {
    test := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    answer := getSmallestMultiple(test)
    fmt.Println(answer)
}

我试图找到可以被test 中的所有数字整除的最小数字。

我创建了一个工人池,并正在向他们发送值,直到其中一个 goroutine 找到一个可以被 test 中的所有数字整除的数字

for w := 0; w < 100; w++ {
    go divisibleByAllNumbers(&numbers, jobs, answer)
}


go func() {
    for i := max; ; i += max {
        fmt.Printf("Sending # %d\n", i)
        jobs <- i
    }
}() 

尽管我启动了多少个工人,但程序似乎以相同的速度运行。我已经尝试了许多工作人员,并且总是需要相同的秒数才能运行,这似乎根本没有同时完成工作。

每个工作人员都在使用range 消耗队列中的工作:

for j := range jobs {}

我希望在jobs 频道上消耗的进程越多,程序执行的速度就越快。

我还尝试了 jobs := make(chan int) 缓冲区值的不同值

我整天盯着这个,希望有人能看出问题所在。我希望我添加的工人越多,计算的速度就越快,但我没有遇到这种情况。我确定我遗漏了一些关键概念,

谢谢

【问题讨论】:

  • 您对 GOMAXPROCS 的设置是什么?
  • 当 GOMAXPROCS 为 1 时,goroutine 更像线程而不是进程,因此您无法从单个 CPU 内核中获得更高的速度。当您有一些阻塞 I/O 但对您的代码没有帮助时,这很有用。增加 GOMAXPROCS 应该会有所帮助,因为 go 运行时会将 goroutine 拆分到多个进程中。
  • 处理器或进程@TheHippo?他们......有点不同:P
  • @SimonWhitehead 我想我是对的。增加 GOMAXPROCS 将确保您的程序将使用多个进程,因此会更改为使用多个处理器。
  • @TheHippo:GOMAXPROCS 设置用于调度用户 goroutine 的操作系统 线程 的数量。只有 1 个进程(对于“进程”的传统定义)。

标签: concurrency go


【解决方案1】:

http://golang.org/doc/effective_go.html#parallel

默认情况下,Go 运行时的当前实现不会并行化此代码。它仅将一个内核专用于用户级处理。在系统调用中可以阻塞任意数量的 goroutine,但默认情况下,任何时候只有一个可以执行用户级代码。它应该更智能,并且有一天它会更智能,但是在你想要 CPU 并行性之前,你必须告诉运行时你想要同时执行多少个 goroutines 代码。有两种相关的方法可以做到这一点。将环境变量 GOMAXPROCS 设置为要使用的内核数运行您的作业,或者导入运行时包并调用 runtime.GOMAXPROCS(NCPU)。一个有用的值可能是 runtime.NumCPU(),它报告本地机器上逻辑 CPU 的数量。同样,随着调度和运行时间的改进,预计此要求将被淘汰。

【讨论】:

  • 请注意,由于调度程序的改进,对于 go1.5,GOMAXPROCS 现在默认为 runtime.NumCPU()(尽管 runtime.GOMAXPROCS 调用仍然存在,因为 NumCPU 并不是普遍最优的)
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多