Hacker News 中文摘要

RSS订阅

Clojure异步流程指南 -- Clojure Async Flow Guide

文章摘要

Flow库通过将应用逻辑与拓扑、执行、通信、生命周期、监控和错误处理等部署问题严格分离,简化了开发。开发者提供step-fns作为逻辑,Flow将其封装为运行进程,管理进程生命周期并通过通道处理消息。Step-fns不直接访问通道或持有状态,便于独立测试和复用。

文章总结

Flow 指南

简介 Flow 库实现了应用逻辑与部署拓扑、执行、通信、生命周期、监控和错误处理的严格分离。通过提供逻辑步骤函数(step-fns),这些函数被封装为运行进程,并在循环中执行。Flow 管理进程的生命周期,并通过通道处理输入和输出消息。步骤函数不直接访问通道或持有状态,使其易于单独测试和重用。

步骤函数及其功能 步骤函数有四种形式: 1. 描述(describe):返回步骤函数的静态描述,包括参数、输入和输出通道。 2. 初始化(init):在进程启动时调用,接受一组参数并返回进程的初始状态。 3. 状态转换(transition):在流程或进程经历生命周期转换时调用,更新状态以用于后续调用。 4. 转换(transform):在每次接收到输入消息时调用,返回新状态和输出消息的映射。

进程状态 进程状态是一个映射,包含步骤函数转换和转换形式所需的任何键。此外,还有一些特定于流的键,如进程ID、输入和输出端口。

步骤函数辅助工具 提供了一些辅助工具来从其他形式创建步骤函数,如 lift*->steplift1->stepmap->step

创建进程启动器 使用 process 函数创建进程启动器,该函数接受步骤函数和选项映射。选项包括工作负载类型(混合、IO 或计算)和计算超时。

重新加载 由于步骤函数在循环中调用,建议将步骤函数定义在变量中,以支持交互式开发。

流程定义 流程定义包括进程启动器和它们之间的连接。通过 create-flow 函数创建流程,返回的流程对象可以传递给生命周期方法。

流程生命周期 流程创建后处于恢复状态。可以使用 startstoppauseresume 等函数改变流程生命周期状态。还可以使用 pingping-proc 函数检查运行进程的状态和状态。

流程监控 参见 core.async.flow-monitor 了解如何使用流程监控工具。

评论总结

  1. Clojure的活跃度与生态

    • 有评论质疑Clojure的活跃度,认为其在Hacker News上的讨论减少。
      • "Is Clojure still a thing? I sure would hope so, but I haven't seen much of Clojure activity in HN recently."
    • 也有评论提到Clojure生态较小,学习JVM工具链的意愿低。
      • "I think LISP is cool and want to use it more but I have 0 appetite to learn the toolchain and debug etc for JVM."
  2. 异步处理与并发

    • 有评论认为Clojure的异步处理能力不足,尤其是与JavaScript和C#相比。
      • "I was just thinking about dismissing Clojure for a project I'm going to work on because I was concerned about it's lack of ability to work with async calls."
    • 也有评论提到core.asynccore.async.flow在结构化并发中的优势,认为其可以简化错误处理和线程管理。
      • "I view core.async.flow as the Clojure version of the upcoming Structured Concurrency JEP."
  3. 工具与库的比较

    • 有评论将core.async.flowmanifold进行比较,认为两者适用于不同的场景。
      • "Choose core.async.flow when you want a declarative, monitorable process graph over channels."
    • 也有评论提到其他相关工具如missionary/electricrama,希望有统一的接口。
      • "See also for related ideas: missionary/electric for frontend and rama for backend."
  4. 技术细节与使用体验

    • 有评论提到core.async.flow的拓扑结构不可变,质疑其适用性。
      • "I still can't get my head around the fact that core.async.flow topologies are immutable."
    • 也有评论分享使用core.async的体验,认为其改变了系统设计的方式。
      • "It was realizing I could model entire business processes as a system of communicating channels."
  5. 错误与改进建议

    • 有评论指出文档中的拼写错误,并提出了修改建议。
      • "The description arity takes the current state ... should be The transition arity takes the current state ..."