我是core.async(以及更普遍的CSP)的新手,并且难以找到好的调试策略。特别是,我经常无法诊断代码的哪一部分无限地阻塞主线程。我将提供一个特定的例子
(deftest passing-test
(let [c (async/to-chan! [2 1 0 5 4])]
(is (= [2 1 0 5 4]
(async/<!! (async/into [] c))))))
(deftest hanging-test
(let [[e o] (->> (async/to-chan! [2 1 0 5 4])
(async/split even?))]
(is (= [2 0 4]
(async/<!! (async/into [] e))))
(is (= [1 5]
(async/<!! (async/into [] o))))))
第一个测试通过且不会阻塞主线程。第二个测试一直挂起。唯一的区别是添加了async/split
来将偶数和奇数整数路由到相应的通道。
以下是我的具体问题
是什么解释了第一个和第二个测试在阻塞主线程方面的差异?
有什么策略可以调试意外阻塞主线程的core.async代码?
编写创建和操作通道的代码的单元测试的最佳方式是什么?(async/<!! (async/into [] o))
是否是收集通过通道流动的值的合理方式?