检查Clojure(脚本)通道是否已满

时间:2016-01-16 03:00:34

标签: clojure clojurescript

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

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

1 个答案:

答案 0 :(得分:4)

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

  • offer!如果空间可用,请在频道上放置一些内容,并告知您是否已满。
  • poll!如果有可用的话会得到一些东西,并让你知道该频道目前是否提供任何东西。

所以你可以这样写:

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

当您在频道上放置内容时,这将实现此目的。这可能比尝试让另一个进程监视它已满并然后关闭它更安全。如果你真的想检查它是否已满,你可以提取缓冲区并询问它:

user> (->> (async/chan (async/buffer 1))
           (.buf)
           (.full?))
false
虽然认真通过先仔细考虑。