golang协程工作池处理多任务示例

1. 工作方法实现

// 工作线程
// id : 线程号
// jobs : 任务通道 (chan)
// results: 完成结果通道 (chan)
func worker(id int, jobs <-chan int, results chan<- int) {
	//遍历任务
	for j := range jobs {
		fmt.Println("工作协程: ", id, "启动任务: ", j)
		fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
		time.Sleep(time.Second)
		fmt.Println("工作协程: ", id, "结束任务", j)
		results <- j * 2 //任务完成后写入结果到通道
	}
}

2.创建任务通道与任务执行结果通道

const numJobs = 5                  //通道容量
	jobarr := make(chan int, numJobs)  //任务通道
	results := make(chan int, numJobs) //任务执行结果通道

3.创建协程工作池

//启动3个工作协程
	for w := 1; w <= 3; w++ {
		go worker(w, jobarr, results)
	}

4.向工作通道发送任务

//向任务通道发送5个任务
	for j := 1; j <= numJobs; j++ {
		jobarr <- j //发送任务到任务通道
	}
	close(jobarr) //关闭任务通道

5.遍历执行结果:

//遍历执行结果
	for a := 1; a <= numJobs; a++ {
		<-results //读取通道数据不做处理
	}

6.完整示例

// 工作线程
// id : 线程号
// jobs : 任务通道 (chan)
// results: 完成结果通道 (chan)
func worker(id int, jobs <-chan int, results chan<- int) {
	//遍历任务
	for j := range jobs {
		fmt.Println("工作协程: ", id, "启动任务: ", j)
		fmt.Println(">>>>>>休眠2秒,模拟工作处理数据中...")
		time.Sleep(time.Second)
		fmt.Println("工作协程: ", id, "结束任务", j)
		results <- j * 2 //任务完成后写入结果到通道
	}
}


const numJobs = 5                  //通道容量
	jobarr := make(chan int, numJobs)  //任务通道
	results := make(chan int, numJobs) //任务执行结果通道
	//启动3个工程协程
	for w := 1; w <= 3; w++ {
		go worker(w, jobarr, results)
	}
	//向任务通道发送5个任务
	for j := 1; j <= numJobs; j++ {
		jobarr <- j //发送任务到任务通道
	}
	close(jobarr) //关闭任务通道
	//遍历执行结果
	for a := 1; a <= numJobs; a++ {
		<-results //读取通道数据不做处理
	}

输出结果:

工作协程:  3 启动任务:  1
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  2 启动任务:  2
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  1 启动任务:  3
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  2 结束任务 2
工作协程:  2 启动任务:  4
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  3 结束任务 1
工作协程:  3 启动任务:  5
>>>>>>休眠2秒,模拟工作处理数据中...
工作协程:  1 结束任务 3
工作协程:  3 结束任务 5
工作协程:  2 结束任务 4

执行流程示例图:

相关推荐

  1. golang 实现

    2024-06-08 13:12:01       36 阅读
  2. Golangants使用笔记

    2024-06-08 13:12:01       38 阅读
  3. golang 动态扩缩容

    2024-06-08 13:12:01       13 阅读
  4. Lua

    2024-06-08 13:12:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 13:12:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 13:12:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 13:12:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 13:12:01       20 阅读

热门阅读

  1. Meta Llama 3 文本编码为 token

    2024-06-08 13:12:01       10 阅读
  2. Android 安全开发之 exported 组件安全

    2024-06-08 13:12:01       7 阅读
  3. Kafka 详解:全面解析分布式流处理平台

    2024-06-08 13:12:01       7 阅读
  4. [汇总] CentOS中查询端口&终止进程的指令

    2024-06-08 13:12:01       8 阅读
  5. Vue:状态管理pinia

    2024-06-08 13:12:01       9 阅读