gpt4 book ai didi

clojure - core.async 中的重叠分区

转载 作者:行者123 更新时间:2023-12-02 10:14:08 24 4
gpt4 key购买 nike

在 Clojure 中,我可以通过将 step 参数调整为 partition 来获得集合的重叠分区:

(partition 3 1 (range 20))

;; ((0 1 2) (1 2 3) (2 3 4) (3 4 5) ...)

core.async 确实有一个分区函数,但由于它不接受步骤参数,所以我无法获得重叠分区:

(let [c (chan)]
(go (doseq [n (range 20)]
(>! c n)))

(go-loop [p (async/partition 3 c)]
(when-let [v (<! p)]
(prn v)
(recur p))))

;;[0 1 2]
;;[3 4 5]
;;[6 7 8]

我意识到拥有这个可能意味着能够多次从 channel 读取相同的值。我还知道我可以创建自己的函数,从 channel 中读取所需数量的值并构建自己的分区。

但是我想知道是否有任何方法可以使用 core.async 提供的核心 API 来实现此目的。

PS。 sliding-buffer 并不能解决问题,因为我无法立即查看整个缓冲区。

最佳答案

恕我直言,我认为这个愿望

"being able to read the same value from a channel more than once"

违背了core.async的原则。

每次从 channel 读取一个值时,您都会从 channel 中取出该值

因此, channel 行为的好处在于,它保证对每个值进行一次读取,如果没有值则不读取(阻塞/停放线程),如果 channel 关闭则为 nil。

然后,开始解决问题的下一个问题应该是:为什么(在 core.async 上)至少有 3 个不同的函数可以将值放入/取出 channel 。因此,将通信 channel 视为集合点,在读取器和写入器可用之前,存在 (core.async) 3 种不同的应用程序/线程行为:

  • 阻塞线程 >!! <!!正在运行的线程将被阻塞,直到读取器和写入器都可用为止。
  • 停放线程(使用go宏 block )>! <! go block 将创建一个伪线程,该线程将被暂停,直到读取器和写入器都可用。此行为不会阻止您正在运行的线程。
  • 异步行为 take! put!仅保证写入和读取的顺序

关于clojure - core.async 中的重叠分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22603608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com