欢迎!请查看 关于 页面,了解有关此功能的一些更多信息。
这个问题在这里出现: 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!)
(mapcat identity)
我预期在取走集合 C1 的所有元素之前,任何 put! 的操作都将失败。
使用 offer! 的非阻塞 put! 操作将一直失败。
阻塞的 put! 调用将阻塞,但对于通道上的单个 take! 调用而言。这很令人惊讶。put! 的值去哪里了?一切仍然像预期那样继续“工作”,但缓冲区的行为好像增长到大小为 2(2 个输入集合,1 个通过变换器的部分输出)
我认为这个问题可以通过在 (impl/remove! buffer) 调用之后,在处理任何 put! 之前检查缓冲区是否已满来解决。请参阅补丁,了解具体细节。我不确定这个更改是否破坏了某些内容,因为我对这个代码库不够熟悉;尽管测试通过了。
(impl/remove! buffer)
评论由:brianru
用包含测试的补丁替换了补丁,以演示更改前后该行为的差异。