【发布时间】:2018-06-12 15:46:32
【问题描述】:
我正在学习core.async,并编写了一个简单的生产者消费者代码:
(ns webcrawler.parallel
(:require [clojure.core.async :as async
:refer [>! <! >!! <!! go chan buffer close! thread alts! alts!! timeout]]))
(defn consumer
[in out f]
(go (loop [request (<! in)]
(if (nil? request)
(close! out)
(do (print f)
(let [result (f request)]
(>! out result))
(recur (<! in)))))))
(defn make-consumer [in f]
(let [out (chan)]
(consumer in out f)
out))
(defn process
[f s no-of-consumers]
(let [in (chan (count s))
consumers (repeatedly no-of-consumers #(make-consumer in f))
out (async/merge consumers)]
(map #(>!! in %1) s)
(close! in)
(loop [result (<!! out)
results '()]
(if (nil? result)
results
(recur (<!! out)
(conj results result))))))
当我通过 Emacs 苹果酒提供的调试器中的process 函数时,这段代码运行良好。
(process (partial + 1) '(1 2 3 4) 1)
(5 4 3 2)
但是,如果我自己运行它(或在调试器中点击继续),我会得到一个空结果。
(process (partial + 1) '(1 2 3 4) 1)
()
我的猜测是,在第二种情况下,出于某种原因,生产者在退出之前不会等待消费者,但我不确定为什么。感谢您的帮助!
【问题讨论】:
标签: clojure core.async cider