以下是一个可能的实现:
package main
import (
"fmt"
"math/rand"
)
func worker(id int, jobs <-chan []int, results chan<- []int) {
for job := range jobs {
fmt.Printf("Worker %d started job\n", id)
for i := range job {
job[i] = job[i] * rand.Intn(10)
}
results <- job
fmt.Printf("Worker %d finished job\n", id)
}
}
func main() {
data := make([]int, 10000)
for i := range data {
data[i] = rand.Intn(10)
}
numWorkers := 100
jobs := make(chan []int, numWorkers)
results := make(chan []int, numWorkers)
for i := 0; i < numWorkers; i++ {
go worker(i, jobs, results)
}
for i := 0; i < numWorkers; i++ {
start := i * len(data) / numWorkers
end := (i + 1) * len(data) / numWorkers
slice := make([]int, end-start)
copy(slice, data[start:end])
jobs <- slice
}
close(jobs)
var res []int
for i := 0; i < numWorkers; i++ {
res = append(res, <-results...)
}
fmt.Println("Result:", res)
}
这里将处理任务分配给100个goroutine,每个goroutine都会从jobs channel中读取一段长度为100的slice进行处理,并将结果存入results channel中。最后,将所有结果按顺序放回res slice中输出。
需要注意的几点:
- 在分配任务时,我们将原始数据划分为100个等长的slice,并将它们发送到jobs channel中。这样可以确保每个goroutine都处理相同数量的数据。
- 使用两个channel来协调工作,而不是直接修改共享变量。这种方式更安全、更易于管理。
- 使用了rand.Intn()来随机生成一个0到10之间的数字乘以每个元素,以便模拟一些实际的计算处理过程。
- 需要等待所有goroutine完成任务后才能继续执行,因此使用了res slice来收集结果,并在最后输出。




