研究用 go 控制并发数的时候发现一个example,就改造了下发现一个问题,源码
package main
import "time"
func worker(id int, jobs <-chan int, results chan <- int) {
for j := range jobs {
time.Sleep(time.Second)
results <- j
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
//发送 jobs
for j := 1; j <= 10000; j++ {
go func() {
jobs <- j
}()
}
//go func() {
// for j := 1; j <= 10000; j++ {
// jobs <- j
// }
//}()
for {
select {
case r := <-results:
println("result:", r)
}
}
}
但输出缺有缺失,并且还有重复
result: 14
result: 15
result: 8
result: 15
result: 15
result: 15
result: 15
result: 15
result: 15
...
将源码中发送 jobs 的部分改为
go func() {
for j := 1; j <= 10000; j++ {
jobs <- j
}
}()
结果又是正常的
result: 3
result: 2
result: 1
result: 5
result: 4
result: 6
result: 9
result: 8
result: 7
result: 10
result: 12
result: 11
result: 14
result: 15
result: 13
有谁知道原因吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.