你好!
我正在修复ASYNC-163 漏洞,我认为我已经找到了一个稳健的解决方案,不需要对 pipeline*
函数做出太多修改。
我对为Clojure做出贡献比较新手,所以我对过程有点不确定,尽管我在clojure.org网站上读了一些东西。问题已经有一个现成的工单,我在上面链接了,然而它已被标记为“不会修复”,我没有Jira账户在那里进行评论和发送补丁,所以我决定在这里发布。
通过研究 pipeline*
函数的源代码,我了解了将工作在go线程和通道之间传递的整个过程,并找到了一个简单的修复方法,它需要添加一个额外的通道来同步工作生成器和结果消费者线程。
我在我的博客中对这个漏洞进行了更详细的解释。它相当长且复杂,因此我认为最好在这里不重复它,以免使这个问题变得过于冗长和难以理解。解释在这里可用。
我在这里附上了补丁,如果这个地方不适合这类问题,请随时指出。我在REPL中测试了各种场景,并在我的一个项目中,它使用标准的 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
错误。不清楚缺少了什么,项目的README只提到除了使用 lein 构建和打开 HTML 文件之外的任何要求。但是修复本质上相同,所以应该运行良好。
编辑于 2022 年 12 月 08 日
我将修复后的 pipeline*
版本放入了一个名为 pipeline-extras 的库中。它还包含了所有管道的无序版本,由于即使某些任务完成时间比其他任务长,传送带也不会停止,因此应具有更高的吞吐量。