Asynchronous 为什么这个core.async通道无法预测地挂起?

Asynchronous 为什么这个core.async通道无法预测地挂起?,asynchronous,clojure,core.async,Asynchronous,Clojure,Core.async,这是脚本的一部分,我正试图使用core.async中的通道。大约有一半的时间,我运行它,它会停止没有完成和通过程序前进;其他时候,它会成功完成 我怀疑这个问题与我等待(使用())异步线程响应的方式有关——但是我应该如何处理这个问题呢 (defn async-writer [chan num-buckets] (let [file-handles (get-filehandles num-buckets)] (ca/thread (loop []

这是脚本的一部分,我正试图使用
core.async
中的通道。大约有一半的时间,我运行它,它会停止没有完成和通过程序前进;其他时候,它会成功完成

我怀疑这个问题与我等待(使用
())异步线程响应的方式有关——但是我应该如何处理这个问题呢

(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)))))
(defn异步编写器
[chan num buckets]
(让[文件句柄(获取文件句柄num bucket)]
(ca/线程(循环[])
(当让[rec(铲斗rec num BUCKES))
(str(rec:rows)\newline)
(再次出现)
:已完成)
(defn)过程数据文件
[数据目录num bucket]
(让[outchan(ca/chan)
commchan(异步写入程序输出chan num bucket)]
(试试看
(doseq[f(数据文件数据目录)]
(让[rdr(注册文件clojure.java.io/reader f)]
(doseq[r(do)(println“Processing”(.f getName))
(文件->记录rdr))]
(放!放)
(关闭文件rdr)))
(关闭!outchan)
前缀

(最后(为了将来的参考,我使用了Igrapenthin的评论来解决这个问题。我在我的频道中添加了一个缓冲区,并将异步
put!
调用更改为
!!
调用。这样,当缓冲区满了时,主线程会等待异步写入程序。

您正在处理多少数据文件?您的outchan是无缓冲的,b默认情况下,最多允许1024个挂起的PUT。嗯。我正在处理足够多的数据,如果写入程序落后,则有1024个PUT可以备份。我如何防止这种情况?如果不想阻止主线程,请使用
go
或另一个
线程
。缓冲不应该是必需的,因为您只是p从一个地方出发。