gpt4 book ai didi

clojure - 如何清楚地构建 core.async channel 之间的依赖关系?

转载 作者:行者123 更新时间:2023-12-04 12:40:09 25 4
gpt4 key购买 nike

假设我有一个要使用 core.async 异步运行的计算语料库,但不幸的是,其中一些函数依赖于其他函数的输出。我如何在我的代码中清晰地构建它,同时获得最佳性能?

我遇到的一些潜在解决方案是

  • Prismatic's Graph - 看起来很合理,虽然我还没有用 core.async channel 测试过它;事实上,它需要使用 fnk对我来说有点令人反感,因为它需要购买他们的 DSL 来定义函数,但如果这是最好的解决方案,那么我不介意。
  • Javelin cells - 仅适用于 ClojureScript(当前)并使用 FRP 而不是 CSP 作为实现,但它在通过公式单元格对计算之间的依赖关系建模方面做得非常好。
  • Onyx - 用于分布式计算(作为 Apache Storm 的竞争对手等),但具有“工作流”抽象,用于处理计算之间的依赖关系并与 core.async 一起工作。这似乎最适合我的问题域,但我不确定是否需要所有集群管理功能的开销。

  • 这个问题的规范解决方案是什么?

    编辑:添加玛瑙

    最佳答案

    这个问题有点难回答,因为你的问题缺乏关于你的用例的细节。 Graph、Javelin 和 Onyx 等库都有不同的用例,不仅仅是使计算相互依赖。

    如果您只想让一个线程或 go 块依赖于系统另一部分生成的结果,我建议只使用 core.async 原语,而无需任何其他库。

    使执行等待另一个事件线程的最基本的解决方案是在从 channel 获取值时使用阻塞获取。当该 channel 上没有可用值时,这将停止线程(或 go 块)。

    正如您在以下示例中所见,根据另一个线程中完成的事件进行计算非常容易。

    (let [c (chan)]
    (thread (>!! c “hello”))
    (assert (= “hello” (<!! c)))
    (close! c)

    还有更精细的机制可用。 Alts!!函数提供了同时等待多个 channel 的能力。几种不同口味的 pipeline函数允许您以类似数据流的方式对并发进行建模。

    您是否遇到了使用内置函数无法清楚表达的任何特定问题?

    关于clojure - 如何清楚地构建 core.async channel 之间的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660056/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com