我尝试将通道转换为序列。这是我目前使用的方法
(defn chan->seq [ch]
(when [v (<!! ch)]
(lazy-seq (cons v (chan->seq ch)))))
它工作了,但是它使用了一个阻塞的读取,因此当前线程将被阻塞,直到通道关闭,同时不能激活许多此类函数调用的同时。这个函数有非阻塞版本吗?
此示例演示了这个问题
(doseq [_ (range 20)]
(go (chan->seq (chan 10))))
(go (println :OK))
最后一条语句将不会打印任何内容,因为 chan->seq
调用正在占用线程池中的所有线程。如果将20更改为5(在新的REPL会话中),它就会工作。