掌握 Go 并发:玩转 Channel

我曾经用 Go 构建过一个图像处理流水线。

我在每一步都使用了 goroutine。我用 channel 将它们连接起来。我点击了运行。

程序卡死了。内存占用不断攀升。然后它崩溃了。没有任何错误提示。只有一片死寂。

我浪费了几个小时去调试一个损坏的调度器。但我错了。我并不理解 channel 的工作原理。

以下是防止 Go 程序挂起的三个规则。

  1. Nil channel 是黑洞 Nil channel 会永久阻塞。如果你在 nil channel 上发送或接收,goroutine 会一直卡在那里。
  1. 关闭规则可防止 panic 关闭一个 channel 是永久性的。
  1. 使用 channel 方向确保安全 Go 允许你指定 channel 是用于发送还是接收。

如何构建一个清晰的流水线:

当你遵循这些模式时,可以防止泄漏和 panic。你构建的系统将易于测试且稳健。

你的挑战: 编写一个函数,将多个输入 channel 合并为一个输出 channel。使用 select 循环。添加 500ms 的超时机制。确保没有 goroutine 泄漏。

在评论区提交你的解决方案。

来源: https://dev.to/timevolt/go-concurrency-the-jedis-guide-to-goroutines-channels-may-the-fork-be-with-you-2g79