在通道底部放置一个值?
Placing a value at the bottom of a channel?
在 Clojure(Script) 中,是否可以在通道的底部(而不是顶部)阻塞一个值,以便下次从中获取它(例如通过使用 <!
在一个 go 块中),保证你塞入其中的值将是接收到的值?
我不确定是否有任何简单的方法可以做到这一点。您可以实现自己的缓冲区类型,如 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
的实施细节,将来可能会中断。
你可以有两个频道,假设一个叫做 first-class
,另一个叫做 economy
。您编写了一个 go-loop
,它只是重复出现并在两个通道上调用 alts!
(或 alts!!
),但使用 first-class
的 :priority
选项。然后你将值放入economy
作为你的"normal"输入通道,当你想要一个值跳线时,你将它放入first-class
.
在 Clojure(Script) 中,是否可以在通道的底部(而不是顶部)阻塞一个值,以便下次从中获取它(例如通过使用 <!
在一个 go 块中),保证你塞入其中的值将是接收到的值?
我不确定是否有任何简单的方法可以做到这一点。您可以实现自己的缓冲区类型,如 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
的实施细节,将来可能会中断。
你可以有两个频道,假设一个叫做 first-class
,另一个叫做 economy
。您编写了一个 go-loop
,它只是重复出现并在两个通道上调用 alts!
(或 alts!!
),但使用 first-class
的 :priority
选项。然后你将值放入economy
作为你的"normal"输入通道,当你想要一个值跳线时,你将它放入first-class
.