我对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))
是否是一种将流过通道的值收集到集合的合理方式?