在通道底部放置一个值?

时间:2016-01-23 08:56:13

标签: clojure clojurescript core.async

在Clojure(脚本)中,无论如何都要在一个通道的底部(而不是顶部)处堵塞一个值,以便下次从中取出(例如在内部使用<! go block),保证你卡在它里面的值是收到的值吗?

2 个答案:

答案 0 :(得分:2)

我不确定有什么简单的方法可以做到这一点。您可能能够实现自己的缓冲区类型,如buffers.clj,然后使用该缓冲区实例化您的通道:

(chan (lifo-buffer 10))

例如,您可以创建一个像LIFO队列一样工作的缓冲区:

(deftype LIFOBuffer [^LinkedList buf ^long n]
  impl/UnblockingBuffer
  impl/Buffer
  (full? [this]
    false)
  (remove! [this]
    (.removeFirst buf))
  (add!* [this itm]
    (when-not (>= (.size buf) n)
      (.addFirst buf itm))
    this)
  (close-buf! [this])
  clojure.lang.Counted
  (count [this]
    (.size buf)))

(defn lifo-buffer [n]
  (LIFOBuffer. (LinkedList.) n))

请注意,此解决方案依赖于core.async的实施细节,并可能在将来中断。

答案 1 :(得分:1)

您可以有两个频道,一个叫first-class,另一个叫economy。您编写的go-loop只是在两个频道上重复并调用alts!(或alts!!),但使用:priority的{​​{1}}选项。然后将值放入first-class作为“普通”输入通道,当您想要一个值跳过该行时,将其放入economy