fan-out通过多个goroutine并行处理任务,fan-in将结果汇总;示例中3个worker并行转字符串为大写,结果经fan-in合并输出,体现Golang并发优势。

在并发编程中,fan-in fan-out 是一种常见的模式,用于提高程序的并行处理能力。Golang 凭借其轻量级的 goroutine 和强大的 channel 机制,非常适合实现这一模式。fan-in 指多个数据源合并到一个通道,fan-out 指将任务分发给多个工作者并行处理。下面通过实际例子说明如何在 Golang 中优雅地实现该模式。
fan-out 的核心是将输入数据分发给多个工作协程,让它们并行处理,从而提升吞吐量。通常适用于 CPU 密集型或 I/O 密集型任务,比如批量请求、文件处理等。
实现方式:
fan-in 负责将多个输出 channel 的结果汇聚到一个 channel 中,方便主流程统一处理。这在需要收集所有 worker 结果时非常有用。
立即学习“go语言免费学习笔记(深入)”;
常见做法是启动一个单独的 goroutine,将多个 channel 的数据复制到一个统一的输出 channel 中,直到所有输入 channel 关闭为止。
关键点:
以下是一个完整的 fan-in fan-out 实现,模拟将一批字符串并行转为大写:
package main
<p>import (
"fmt"
"strings"
"sync"
)</p><p>func worker(in <-chan string, out chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
for s := range in {
out <- strings.ToUpper(s)
}
close(out)
}</p><p>func fanIn(channels []<-chan string) <-chan string {
var wg sync.WaitGroup
merged := make(chan string)</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for _, ch := range channels {
wg.Add(1)
go func(c <-chan string) {
defer wg.Done()
for val := range c {
merged <- val
}
}(c)
}
go func() {
wg.Wait()
close(merged)
}()
return merged}
func main() { inputs := []string{"hello", "world", "golang", "concurrency", "fan", "out"}
in := make(chan string, len(inputs))
numWorkers := 3
outputs := make([]chan string, numWorkers)
for i := 0; i < numWorkers; i++ {
outputs[i] = make(chan string)
}
var wg sync.WaitGroup
for i := 0; i < numWorkers; i++ {
wg.Add(1)
go worker(in, outputs[i], &wg)
}
for _, input := range inputs {
in <- input
}
close(in)
merged := fanIn(outputs)
for result := range merged {
fmt.Println(result)
}
wg.Wait()}
这段代码中,3 个 worker 并行处理输入数据,各自将结果写入独立 channel,再通过 fan-in 将所有结果合并输出。整个过程高效且易于扩展。
在实际项目中使用 fan-in fan-out 时,注意以下几点:
基本上就这些。Golang 的并发模型让 fan-in fan-out 实现变得简洁直观,掌握它能显著提升程序的并发处理能力。
以上就是如何用Golang实现fan-in fan-out模式_Golang fan-in fan-out模式实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号