我正在尝试将一个通道转换成一个序列。这是当前我所使用的
(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 会话中),则可正常工作。