go批量执行,并返回批量执行的返回值

方式1

package main

import (
	"fmt"
	"sync"
	"time"
)

func doWork(id int, resultChan chan<- int, wg *sync.WaitGroup) {
	defer wg.Done() // 表示goroutine完成
	time.Sleep(time.Duration(id) * time.Second) // 模拟工作负载
	resultChan <- id * 2 // 发送结果到channel
}

func main() {
	var wg sync.WaitGroup
	resultChan := make(chan int, 5) // 假设我们有5个goroutine

	// 启动多个goroutine
	for i := 1; i <= 5; i++ {
		wg.Add(1) // 增加WaitGroup计数
		go doWork(i, resultChan, &wg)
	}

	// 等待所有goroutine完成
	go func() {
		wg.Wait() // 等待所有goroutine完成
		close(resultChan) // 完成所有工作后关闭channel
	}()

	// 收集所有结果
	for result := range resultChan {
		fmt.Println("Result:", result)
	}
}

方式2

package main

import (
	"fmt"
	"time"
)

func doWork(id int, resultChan chan<- int, doneChan chan<- struct{}) {
	time.Sleep(time.Duration(id) * time.Second) // 模拟工作负载
	resultChan <- id * 2 // 发送结果到channel
	doneChan <- struct{}{} // 发送信号表示完成
}

func main() {
	resultChan := make(chan int, 5) // 存储结果
	doneChan := make(chan struct{}, 5) // 信号channel,表示5个goroutine完成

	for i := 1; i <= 5; i++ {
		go doWork(i, resultChan, doneChan)
	}

	// 收集所有结果
	for i := 1; i <= 5; i++ {
		result := <-resultChan
		fmt.Println("Result:", result)
		<-doneChan // 等待一个goroutine完成
	}
	close(resultChan) // 完成后关闭channel
}
posted @ 2024-12-03 09:50  朝阳1  阅读(2)  评论(0编辑  收藏  举报