欢迎!请参阅 关于页面 了解此功能的更多信息。
此问题在这里出现: 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! 操作都会失败。
非阻塞的 put!(通过 offer!)直到那时才会失败。
阻塞 put! 会阻塞,但仅限于在通道上执行单个 take! 之后。这很令人惊讶。put! 的值去哪里了?一切仍然“按预期”持续“工作”,但缓冲区似乎变大了到大小 2(2 个输入集合和 1 个部分通过转换器输出的集合)
我认为这个问题在调用 (impl/remove! buffer) 之后但在处理任何 put! 之前检查缓冲区是否已满时得到解决。请参阅补丁以了解确切含义。我不确定这个更改是否会破坏任何东西,因为我对这个代码库不太熟悉;尽管测试通过了。
(impl/remove! buffer)
由 brianru 发表的评论:
用包括测试变更和未变更行为的补丁替换了补丁。