你好!
我一直在修复 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
目前我使用带有或不带对我的 async.cljs 文件的补丁运行 CLJS 测试时遇到了一些问题,但一旦我解决了这个问题,我将发布更新版本的补丁,适用于 JVM 和 CLJS 运行时。
编辑:Nov 25 2022
补丁 v2:https://andreyorst.gitlab.io/0001-fix-ASYNC-163-2.patch
此补丁对 async.cljs 也进行了相同的修正,但我因为某个原因无法运行测试——在浏览器中得到 Uncaught TypeError: process.on is not a function
错误。不知道缺少了什么,项目的 README 文件除了提及需要使用 lein 构建 HTML 文件外,没有提及任何要求。但修正基本上是相同的,所以应该能正常工作。
编辑日期:2022年12月8日
我已经将修正后的 pipeline*
版本放入了一个名为 pipeline-extras 的库中。它还包括所有流程的无序列表版本,由于传送带在任意一项任务的完成时间超过其他任务时不停止,所以这些版本应该有更高的吞吐量。