ZBLOG

golang 使用100个goroutine处理长度为10000的slice.将处理后的slice数据全部存入channel

以下是一个可能的实现:

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来收集结果,并在最后输出。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=2309

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?