作为一般政策,不应在go块的范围内执行阻塞操作,这包括像>!!这样的core.async阻塞操作。所以,是的——这里的问题是管道代码违反了这项政策。在实践中,你在这个特定情况下是正确的,即在一个大小为1的空通道上使用>!!不会阻塞(但仍然违反了意图政策)。
使用put!将是另一种选择,然而这里也存在一个更大的概念问题:管道声称使用“并行度n”。然而,通过将那些任务放入go块中,你实际上受限于go线程池的最大并行度,通常是8,这假设没有任何人使用go块线程池,因此可能甚至少于这个数字。其次,如果用户在管道中做了阻塞操作(他们不应该这么做),那么他们很容易锁定整个系统。
转向使用与管道阻塞相同的策略(使用单独的缓存线程池)可以解决并行性问题。然而,这可能不是这个问题的最后改变——我们可能仍然会转向使用显式的固定大小计算线程池,而不是缓存线程池,这会将它们再次分开。所以,没有废弃任何计划——用户仍然在这里声明了一个产生重大差异的意图。