【问题标题】:Failure to close channel causes indefinite blocking关闭通道失败导致无限期阻塞
【发布时间】:2015-05-20 20:21:45
【问题描述】:

这是来自http://www.braveclojure.com/core-async/ 的示例:

(defn hotdog-machine-v2 [hotdog-count]
  (let [in (chan) out (chan)]
    (go (loop [hc hotdog-count]
          (if (> hc 0)
            (let [input (<! in)]
              (if (= 3 input)
                (do
                  (>! out "hotdog")
                  (recur (dec hc))  )
                (do
                  (>! out (Exception. "Not enough payment!"))
                  (recur hc))))
            (do
              (close! in)
              (close! out)))))
    [in out]))
(let [[in out] (hotdog-machine-v2 2)]
  (>!! in "pocket lint")
  (println (<!! out))
  (>!! in 3)
  (println (<!! out))
  (>!! in 3)
  (println (<!! out))
  (>!! in 3)
  (println (<!! out))
  )

如果我省略了通道关闭部分,那么这段代码会永远挂起,为什么?

【问题讨论】:

    标签: clojure core.async


    【解决方案1】:

    如果我在正常情况下运行它并关闭它会打印:

    user> (let [[in out] (hotdog-machine-v2 2)]
      (>!! in "pocket lint")
      (println (<!! out))
      (>!! in 3)
      (println (<!! out))
      (>!! in 3)
      (println (<!! out))
      (>!! in 3)
      (println (<!! out)))
    #error {
     :cause Not enough payment!
     :via
     [{:type java.lang.Exception
       :message Not enough payment!
     ... stack trace here ...
    
     [java.lang.Thread run Thread.java 724]]}
    hotdog
    hotdog
    nil     ;; <---- look here
    

    最后一个 nil 是从 out 读取值 nil 的最后一次读取的结果,由于机器没有热狗,因此由于通道关闭而发送该值。如果没有最后放置 (&gt;!! in 3) 的关闭块,则等待从 chan 中读取的内容,没有人会这样做。默认情况下,写入 core.async 通道在有人准备好读取该值之前不会成功写入

    如果我取出关闭,取出最后一个写入它不会打印那个 nil,并且不会阻塞:

    user> (let [[in out] (hotdog-machine-v2 2)]
      (>!! in "pocket lint")
      (println (<!! out))
      (>!! in 3)
      (println (<!! out))
      (>!! in 3)
      (println (<!! out))
      )
    #error {
     :cause Not enough payment!
     :via
     [{:type java.lang.Exception
       :message Not enough payment!
       :at ... stack trace here ...}
    hotdog
    hotdog
    

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2015-04-02
      • 1970-01-01
      相关资源
      最近更新 更多