golang 利用channel收集多协程返回值

package main

import (
	"fmt"
	"sync"
)

// TaskFinishNotice 定义任务完成通知结构体,可根据自身业务定义
type TaskFinishNotice struct {
	TaskName string
	TaskResult string
}

func main()  {

    defer func() {
		if err := recover(); err != any(nil) {
			fmt.Println("主协程产生panic: ", err)
		}
	}()

	waitGroup := &sync.WaitGroup{}

	//任务数量
	taskNums := 2

	waitGroup.Add(taskNums)

	//定义结果集channel
	resultChannel := make(chan TaskFinishNotice, taskNums)

	go func() {
		//捕获一下协程内的panic
		defer func() {
			if err := recover(); err != any(nil) {
				fmt.Println("任务taskOne, 产生panic: ", err)
			}
		}()

		defer waitGroup.Done()

		//将任务返回值投递到结果集通道
		taskResult := taskOne()
		resultChannel <- TaskFinishNotice{TaskName: "taskOne", TaskResult: taskResult}
	}()

	go func() {
		//捕获一下协程内的panic
		defer func() {
			if err := recover(); err != any(nil) {
				fmt.Println("任务taskTwo, 产生panic: ", err)
			}
		}()

		defer waitGroup.Done()

		//将任务返回值投递到结果集通道
		taskResult := taskTwo()
		resultChannel <- TaskFinishNotice{TaskName: "taskTwo", TaskResult: taskResult}
	}()

	//等待所有协程任务完成并关闭结果集通道
	go func() {

		//捕获一下协程内的panic
		defer func() {
			if err := recover(); err != any(nil) {
				fmt.Println("等待所有协程任务完成并关闭结果集通道产生panic: ", err)
			}
		}()

		//关闭结果集通道
		defer close(resultChannel)

		waitGroup.Wait()

	}()

	//读取结果集
	for result := range resultChannel {
		fmt.Printf("%+v \n", result)
	}
    
    //打印结果:
    //{TaskName:taskOne TaskResult:This is taskOne Result.}
    //{TaskName:taskTwo TaskResult:This is taskTwo Result.}

}

func taskOne() string {
	return "This is taskOne Result."
}

func taskTwo() string {
	return "This is taskTwo Result."
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值