Clojure 2024 调查问卷中发表你的想法!

欢迎!请参阅 关于页面 了解此功能的更多信息。

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! 操作都会失败。

非阻塞的 put!(通过 offer!)直到那时才会失败。

阻塞 put! 会阻塞,但仅限于在通道上执行单个 take! 之后。这很令人惊讶。put! 的值去哪里了?一切仍然“按预期”持续“工作”,但缓冲区似乎变大了到大小 2(2 个输入集合和 1 个部分通过转换器输出的集合)

我认为这个问题在调用 (impl/remove! buffer) 之后但在处理任何 put! 之前检查缓冲区是否已满时得到解决。请参阅补丁以了解确切含义。我不确定这个更改是否会破坏任何东西,因为我对这个代码库不太熟悉;尽管测试通过了。

2 答案

0

由 brianru 发表的评论:

用包括测试变更和未变更行为的补丁替换了补丁。

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