【发布时间】: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