2024 年 Clojure 调查问卷 中分享你的想法!

欢迎!请查看 关于 页面,了解有关此功能的一些更多信息。

0
core.async

这个问题在这里出现: https://groups.google.com/d/topic/clojure/w_p4f3gNo3s/discussion
另一个(可能是)相关以前的讨论: https://groups.google.com/d/topic/clojure-dev/9Ai-ZuCezOY/discussion

场景
1. 一个通道有一个大小为 1 的固定缓冲区和扩展变换器 (mapcat identity)
2. 在另一个线程中执行一次 put! 操作(带有一个集合 C1)
3. 在另一个线程中初始化一个阻塞的 take! 调用
4. 在另一个集合(第二个 put!)

我预期在取走集合 C1 的所有元素之前,任何 put! 的操作都将失败。

使用 offer! 的非阻塞 put! 操作将一直失败。

阻塞的 put! 调用将阻塞,但对于通道上的单个 take! 调用而言。这很令人惊讶。put! 的值去哪里了?一切仍然像预期那样继续“工作”,但缓冲区的行为好像增长到大小为 2(2 个输入集合,1 个通过变换器的部分输出)

我认为这个问题可以通过在 (impl/remove! buffer) 调用之后,在处理任何 put! 之前检查缓冲区是否已满来解决。请参阅补丁,了解具体细节。我不确定这个更改是否破坏了某些内容,因为我对这个代码库不够熟悉;尽管测试通过了。

2 个答案

0

评论由:brianru

用包含测试的补丁替换了补丁,以演示更改前后该行为的差异。

0
参考: https://clojure.atlassian.net/browse/ASYNC-210 (由 brianru 报告)
...