作为一项一般性政策,不应在 go 块的作用域内执行阻塞操作,这包括与 >!! 这样的 core.async 阻塞操作。因此,是的——这里的問題在于管線代码违反了这一政策。在实践中,你在这个特殊案例中是正确的,即对一个大小为1的空通道使用 >!! 不会阻塞(但仍然违反了意图政策)。
使用 put! 将会是另一个选择,然而这里还有更大的概念性问题。管線声称要使用“并行度 n”。但是,通过将这些任务放入 go 块中,你实际上受到 go 线程池的最大并行度的影响,这通常为8,并且假设没有其他人使用 go 块线程池,所以它可能甚至更少。其次,如果用户在管道中执行阻塞操作(他们不应该这样做),那么他们很容易使整个系统锁定。
通过转向使用与管道阻塞相同的策略(使用单独的缓存线程池)解决了并行性问题。然而,这可能不是这一方面的最后变化——我们可能仍然会切换到使用显式的固定大小计算线程池,而不是缓存线程池,这又会将它们分开。所以,没有计划弃用任何东西——用户仍然在陈述一个在这里产生重要差别的意图。