我有一些core.async代码,包含两个chans和三个节点的管道:
-
生产环境 者 - 将值放入chan1的函数> !! (它不在go-block中,但是从go-loop内部调用该函数)
-
一个过滤器 - 另一个不在go-block中而是在go-loop中调用的函数,它从chan1中抽取项目(带有<!!),进行测试,如果测试通过将它们推到chan2上(用>! !)
-
一个消费者 - 一个普通的循环,用于获取chan的n个值
当我将它作为一个简单的程序运行时,此代码按预期工作 . 但是当我将它复制并粘贴到单元测试中时,它会冻结 .
我的测试代码粗略
(deftest a-test
(testing "blah"
(is (= (let [c1 (chan)
c2 (chan)
gen (make-generator c1)
filt (make-filter c1 c2)
result (collector c2 10) ]
result)
[0 2 4 6 8 10 12 14 16 18 20]))
))
其中 generator
创建一个从零开始计数的整数序列和 filter
的均匀度测试 .
据我所知,过滤器能够从c1中提取第一个值,但是被阻塞等待第二个值 . 同时,发电机在等待将其下一个值推入c1时阻塞 .
但是当我在一个简单的独立程序中运行代码时,这不会发生 .
那么,是否有任何理由认为单元测试框架可能会干扰或导致core.async提供的线程管理出现问题?是否可以像这样对异步代码进行单元测试?
我担心我没有在任何类型的go-block或go-loop中运行收集器,所以可能它可能会阻塞主线程 . 但同样,我认为我必须最终将所有数据拉回主线程 . 如果不是通过那种机制,怎么样?
1 回答
虽然在
go
-blocks /go
-loops中使用阻塞IO不是最佳解决方案,但thread
宏可能更适合此处 . 它将在单独的线程上执行传递的主体,因此您可以在那里自由地使用阻塞操作 .