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从一个地方出发。