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