我试图将通道转换为序列。这是我目前使用的
(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 会话中),它将工作。