你好!
我一直在修复ASYNC-163这个错误,我认为我已经找到了一个快速有效的解决方案,这不需要对pipeline*
函数做很多改动。
由于我是 Clojure 的新手, contribute,虽然我在 clojure.org 网站上阅读过有关它的信息。为此,已经存在一个针对该问题的现有票据,我上面已经提到了它,然而,它已被列为“不会修复”,我没有账号在那里发表评论和发送补丁,所以我决定在这里发帖。
经过研究pipeline*
函数的源代码,我已经理解了任务如何在 go-threads 和通道之间传递的整个过程,并找到了一个简单的修复方法,这需要添加一个新的通道来同步作业生产者和结果消费者线程。
我在我的博客中对此错误有更详细的解释。它相当长且错综复杂,所以我认为我没有在这里重复它,这会将这个问题变得不必要地长且难以理解。解释在这里可查这里。
我在这里附带了一个补丁,如果这个位置不适合这种类型的问题,请随意指导我。我已经在 REPL 中测试了各种场景,并在我的一个项目中测试了它,该项目使用常规的 pipeline-async
,它运行正确。此外,它还通过了在 core.async
库中的测试,我使用lein test
命令运行了这些测试。
补丁: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的相同修复,尽管由于某种原因我无法运行测试 - 我在浏览器中遇到了《未捕获的类型错误: process.on 不是一个函数
》错误。不知道缺少什么,项目的readme中只提到了需要使用lein构建并打开HTML文件。但修复方式基本上是一样的,因此应该可以正常运行。
编辑于2022年12月08日
我将修复后的pipeline*
版本放入了一个名为pipeline-extras的库中。它还有所有流程序的无序列表版本,这些版本应该有更高的吞吐量,因为传送带在任意一个任务完成时间比其他任务长的情况下不会停止。