我试图将一个通道转换为序列。这是我目前使用的:
(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(在新会话中),则可以工作。