你好!
我一直致力于修复 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 测试时,无论是否包含对 async.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。它也包含了所有管道的无序版本,由于传送带在任何一个任务完成时间比其他更长时不会停止,这些版本应有更高的吞吐量。