检查 Clojure(Script) 通道是否已满

Checking if a Clojure(Script) Channel is Full

假设 c 是一个大小为 n 的通道。我正在尝试在 clojure(script) 中编写一个函数,该函数检查 c 是否已满,如果已满,则关闭通道。

但是如何检查频道是否已满?

core.async 为此提供了一对函数:

  • offer!如果 space 可用,将内容添加到频道中,并在频道已满时通知您。
  • poll!获取可用的内容,并在当前频道没有内容时通知您。

所以你可以这样写:

(if-not (offer! my-chan 42)
   (close! my-chan))

当你在频道上放东西时,它会完成这个。这可能比尝试让另一个进程在它变满然后关闭它的那一刻更安全。如果你真的只想检查它是否已满,你可以提取缓冲区并询问它:

user> (->> (async/chan (async/buffer 1))
           (.buf)
           (.full?))
false

不过先仔细想想。