我是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))
是否是收集通道中流动的值的合理解法?