你好!
我一直致力于修复 ASYNC-163 这个错误,我认为我找到了一个稳健的解决方案,不需要对 pipeline*
函数做太多改动。
我对向 Clojure 贡献还不熟悉,所以关于这个过程有点不确定,尽管我在 clojure.org 网站上已经了解过。关于这个问题已经有了存在的工单,我已经在上面链接了,但是它被标记为“不会修复”,我没有 Jira 账号去那里评论并发送补丁,所以我决定在这里发布。
在研究了 pipeline*
函数的源代码后,我理解了工作如何在 go-threads 和 channels 之间传递的整个过程,并找到了一个简单的修复方法,只需要添加一个额外的通道来同步工作生产者和结果消费者线程。
我在我的博客中对这个错误的详细解释。它相当长而且复杂,所以我认为最好在这里不重复,以免使这个问题变得过于冗长和难以理解。解释详见 这里。
我在这里附加了一个补丁,如果这个地方不适合这类问题,请随意指正。我已经在各种场景下测试了 REPL,并在我的一个使用常规 pipeline-async
的项目中进行了测试,它工作正常。此外,它还通过了使用 lein test
命令运行的 core.async
库的测试。
补丁:https://andreyorst.gitlab.io/0001-fix-ASYNC-163.patch
目前我遇到了一些问题在异步 . cljs 文件使用或是不使用我的补丁运行 CLJS 测试,但当我解决这个问题后,我会发布一个更新后的补丁,适用于 JVM 和 CLJS 运行时。
编辑:2022年11月25日
补丁 v2:https://andreyorst.gitlab.io/0001-fix-ASYNC-163-2.patch
此补丁包含对 async.cljs 的相同修复,尽管由于某种原因我无法运行测试 - 在浏览器中我遇到了 "未捕获的类型错误:process.on 不是一个函数
" 错误。不确定我遗漏了什么,项目的 readme 没有提到任何要求,除了用 lein 构建 并打开 HTML 文件。但修复方法基本上是相同的,所以它应该可以正常工作。
编辑于 2022 年 12 月 08 日
我已经将固定版本的 pipeline*
放入了一个名为 pipeline-extras 的库中。它还包含了所有管道的无序列表版本,因为如果任何任务的完成时间比其他任务长,输送带将不会停止,所以应该有更高的吞吐量。