package main
import (
"fmt"
"sync"
)
// Complex 定义复数结构体
type Complex struct {
real float64
imag float64
}
// Add 复数加法函数
func (c1 Complex) Add(c2 Complex) Complex {
return Complex{
real: c1.real + c2.real,
imag: c1.imag + c2.imag,
}
}
// ComplexAddWorker 复数加法工作函数
func ComplexAddWorker(taskChan <-chan []Complex, resultChan chan<- Complex, wg *sync.WaitGroup) {
defer wg.Done()
for tasks := range taskChan {
var sum Complex
for _, c := range tasks {
sum = sum.Add(c)
}
resultChan <- sum
}
}
func main() {
// 模拟大量复数
var complexNumbers []Complex
for i := 0; i < 1000; i++ {
complexNumbers = append(complexNumbers, Complex{real: float64(i), imag: float64(i)})
}
const numWorkers = 10
const taskSize = 100
var wg sync.WaitGroup
taskChan := make(chan []Complex, numWorkers)
resultChan := make(chan Complex, numWorkers)
// 启动工作协程
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go ComplexAddWorker(taskChan, resultChan, &wg)
}
// 分发任务
for i := 0; i < len(complexNumbers); i += taskSize {
end := i + taskSize
if end > len(complexNumbers) {
end = len(complexNumbers)
}
taskChan <- complexNumbers[i:end]
}
close(taskChan)
// 等待所有工作协程完成
go func() {
wg.Wait()
close(resultChan)
}()
// 汇总结果
var finalSum Complex
for sum := range resultChan {
finalSum = finalSum.Add(sum)
}
fmt.Printf("最终结果: %v\n", finalSum)
}
- Complex结构体:定义复数结构,包含实部和虚部。
- Add方法:为Complex结构体定义加法方法,用于计算两个复数的和。
- ComplexAddWorker函数:工作协程函数,从任务通道
taskChan
获取复数切片,计算其总和并将结果发送到结果通道resultChan
。
- main函数:
- 初始化复数切片:模拟大量复数。
- 定义工作协程数量和任务大小:分别为
numWorkers
和taskSize
。
- 创建通道和WaitGroup:
taskChan
用于分发任务,resultChan
用于收集结果,wg
用于等待所有工作协程完成。
- 启动工作协程:创建并启动多个工作协程。
- 分发任务:将复数切片分成多个任务发送到
taskChan
。
- 等待并关闭通道:等待所有工作协程完成后关闭
resultChan
。
- 汇总结果:从
resultChan
中收集所有部分结果并汇总得到最终结果。