gpt4 book ai didi

concurrency - Go Worker Pool似乎没有同时处理

转载 作者:数据小太阳 更新时间:2023-10-29 03:35:46 25 4
gpt4 key购买 nike

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

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
}
}()

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

每个工作人员都使用 range 从队列中消费工作:

for j := range jobs {}

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

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

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

谢谢

最佳答案

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

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

关于concurrency - Go Worker Pool似乎没有同时处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31506770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com