在通道底部放置一个值?

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.