package main
import (
"fmt"
"runtime"
)
var workers = runtime.NumCPU()
type result struct {
jobname string
resultcode int
resultinfo string
}
type job struct {
jobname string
results chan<- result
}
func main() {
jobnames := []string{"1", "2", "3", "4", "5", "6", "7", "8"}
dorequest(jobnames)
}
func dorequest(jobnames []string) {
// 定义需要的channels切片
jobs := make(chan job, workers)
results := make(chan result, len(jobnames))
done := make(chan struct{}, workers)
/**
* 把任务写入 JobCh通道
**/
go func( jobs chan <- job, jobnames[]string, results chan <- result){
for _, jobname := range jobnames {
jobs <- job{jobname, results}
}
close(jobs)
}( jobs, jobnames, results)
/**
* 开启n个协程处理任务
**/
for i := 0; i < workers; i++ {
go func( done chan <- struct{}, jobs <- chan job){
for job := range jobs {
job.do()
}
done <- struct{}{}
}( done, jobs)
}
/**
* 查看任务是否完成
**/
go func( done <- chan struct{}, results chan result){
for i := 0; i < workers; i++ {
<-done
}
close(results)
}( done, results)
/**
* 取出结果
**/
for result := range results {
fmt.Printf("done: %s,%d,%s\n", result.jobname, result.resultcode, result.resultinfo)
}
}
func (job job) do() {
fmt.Printf("... doing work in [%s]\n", job.jobname)
// 模拟处理结果
if job.jobname == "8" {
job.results <- result{job.jobname, 0, "ok"}
} else {
job.results <- result{job.jobname, -1, "error"}
}
}
golang 多协程处理任务
最新推荐文章于 2025-08-20 11:49:45 发布
本文介绍了一个使用Go语言实现的简单并发模型案例。该案例通过创建多个协程来模拟并发请求处理,并展示了如何利用channel进行任务分发和结果收集。文章详细解释了从任务分配到结果收集的整个流程。
943

被折叠的 条评论
为什么被折叠?



