我正在尝试将一个通道转换为序列。这是我现在正在使用的方式
(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 会话中)则可以工作。