我是 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))
是将流经通道的值收集到集合中的合理方法吗?