请分享您的想法至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. 在另一个线程中执行一个带有集合(C1)的单次put!操作
3. 启动一个阻塞的take!操作
4. 在另一个线程中执行带有另一个集合的第二次put!操作

我预期任何put!操作都将失败,直到从通道中取出集合C1的所有元素。

非阻塞的put!操作(通过offer!)在这种情况下也会失败。

阻塞的put!操作会阻塞,但直到通道上执行一次单独的take!操作。这是令人惊讶的。put!的值去哪里了?一切似乎都“按预期”继续工作,但缓冲区似乎像增长到了大小2(2个输入集合,1个通过转置器部分输出)

我认为这是通过在调用(impl/remove! buffer)之后以及在处理任何puts之前检查缓冲区是否已满来解决的。请参阅补丁以了解我确切的意思。我不太熟悉这个代码库;尽管测试通过了。

2 答案

0 投票

由brianru发表的评论:

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

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