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