通道多路复用器:增强性能和功能
您对通道多路复用器功能 Mux 的功能和输出表示担忧。让我们解决您的每个问题:
1。 Mux 中出现错误?
Mux 的原始实现中存在一个小问题。从 Mux 生成的每个 goroutine 都尝试从同一通道 (c) 拉取,因为 c 会随着循环的每次迭代而更新。要解决此问题,请按值将通道传递给 goroutine,如下所示:
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
2.有限输出
Mux 旨在将多个通道的输出合并为一个。但是,在您的测试用例中,您仅从输出通道接收最后十个值。这是因为输入通道的关闭会触发 Mux 中的倒计时。当每个输入通道关闭时,倒计时递减并最终达到零,从而导致输出通道关闭。这意味着输出通道将仅接收来自最后几个关闭的输入通道的值。
3.不寻常的喂食模式
由于您使用 goroutine 的方式,喂食模式是意外的。每个 goroutine 都从特定的输入通道中提取值并将其发送到输出通道。然而,由于 goroutine 是独立的,因此它们可以同时执行并以不确定的顺序将值发送到输出通道。这导致喂食明显不规律。
4.更好的方法
为了提高 Mux 的性能和功能,您可以使用名为sync.WaitGroup 的同步原语。 WaitGroup 允许您等待特定数量的 goroutine 完成。在这种情况下,您可以使用 WaitGroup 等待所有负责将值泵送到输出通道的 goroutine 完成。只有在所有 goroutine 完成后,才应关闭输出通道。
以下代码演示了使用 WaitGroup 修改后的 Mux 函数:
import ( "math/big" "sync" ) func Mux(channels []chan big.Int) chan big.Int { var wg sync.WaitGroup wg.Add(len(channels)) ch := make(chan big.Int, len(channels)) for _, c := range channels { go func(c <-chan big.Int) { for x := range c { ch <- x } wg.Done() }(c) } go func() { wg.Wait() close(ch) }() return ch }
通过使用 WaitGroup,您可以确保输出通道是仅当所有输入通道都已处理完毕时才关闭,允许您以确定的顺序接收来自所有输入通道的所有值。
以上是如何提高通道多路复用器功能的性能并确保接收到所有输出值?的详细内容。更多信息请关注PHP中文网其他相关文章!