我正在尝试将通道转换为 seq。这是我目前使用的
(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 会话中),则可行。