大家好!
我已经为 ASYNC-163 问题开发了一个修复方案,并相信这提供了一个不需要对 pipeline*
函数进行太多更改的强大解决方案。
我刚开始为 Clojure 做贡献,所以我对这个过程有些不确定,尽管我在 clojure.org 网站上已经阅读了相关信息。已经存在一个针对该问题的工单,我上面已经提供了链接,但它已被标记为 "不予修复",我没有 Jira 账户在上面评论并发送补丁,所以我决定在这里发布。
通过研究 pipeline*
函数的源代码,我了解了工作如何在 go-threads 和 channels 之间传递的整个过程,并且找到了一个简单的修复方案,它需要添加一个额外的频道来同步生产者线程和消费者线程。
我在自己的博客中详细解释了这个错误。内容有点长,因此我认为最好在这里不重复,以免使问题变得过于冗长和难以理解。解释可在此处找到此处。
我这里附加了一个补丁,如果这个地方不适合这种类型的问题,请随时告诉我。我已经在 REPL 中用各种场景测试过,以及在用我的补丁修改的 async.cljs 文件的一个项目中进行测试,它在那里运行正确。此外,它通过了在 core.async
库中运行的测试,我使用 lein test
命令进行了运行。
补丁:https://andreyorst.gitlab.io/0001-fix-ASYNC-163.patch
目前我在使用或不用我的补丁运行 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 日
我将 fixes 版本的 pipeline*
放入了一个库 pipeline-extras。它还包括所有管道的非顺序版本,这些版本应具有更高的吞吐量,因为传送带不会因为任何任务完成时间比其他任务长而停止。