这是我尝试使用来自core.async
的频道的脚本的一部分。大约一半的时间我运行它,它将停止而不完成并继续执行程序;其他时候,它成功完成。
我怀疑这个问题与我等待((<!! commchan)
)来自异步线程的响应的方式有关 - 但是我应该如何处理呢?
(defn async-writer
[chan num-buckets]
(let [file-handles (get-filehandles num-buckets)]
(ca/thread (loop []
(when-let [rec (<!! chan)]
(.write (file-handles (record->bucket rec num-buckets))
(str (rec :rows) \newline))
(recur)))
:finished)))
(defn process-data-files
[data-directory num-buckets]
(let [outchan (ca/chan)
commchan (async-writer outchan num-buckets)]
(try
(doseq [f (data-files data-directory)]
(let [rdr (registered-file clojure.java.io/reader f)]
(doseq [r (do (println "Processing" (. f getName))
(file->records rdr))]
(put! outchan r))
(close-file rdr)))
(close! outchan)
prefix
(finally (<!! commchan)
(close-all-open-files)))))
答案 0 :(得分:0)
为了将来参考,我使用了Igrapenthin的评论来解决这个问题。我为我的频道添加了一个缓冲区,并将异步put!
调用更改为>!!
个调用。这样,当缓冲区已满时,主线程将等待异步编写器。