为什么这个core.async频道无法预测?

时间:2014-04-04 20:43:33

标签: asynchronous clojure core.async

这是我尝试使用来自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)))))

1 个答案:

答案 0 :(得分:0)

为了将来参考,我使用了Igrapenthin的评论来解决这个问题。我为我的频道添加了一个缓冲区,并将异步put!调用更改为>!!个调用。这样,当缓冲区已满时,主线程将等待异步编写器。