用途:在 Effect-TS 中处理并行操作、限流,以及在 fiber 之间传递信号。适用场景包括处理大型 effect 数组(Effect.all、Effect.forEach)、限制外部 API 或数据库连接的速率、协调后台 fiber 的工作、在应用不同部分间通知完成或状态变化。简单顺序操作或标准 Promise.all 足够时不建议使用。
主要能力与核心模式:Effect-TS 提供轻量 fiber 实现高性能并发。关键原则是显式控制并行度。无界并行是“打开文件过多”或“连接超时”的常见根源。处理集合时应始终指定并发数,例如:Effect.all(effects, { concurrency: 10 })。
主要工具:Fiber 用于后台执行(Effect.fork / Fiber.join);Semaphore 用于限制并发或限流(semaphore.withPermits(n));Deferred 用于一次性信号传递(Deferred.await / Deferred.succeed);concurrency 选项可用于 all、forEach、mapEffect,形式为 { concurrency: number }。
限流用法:多个独立操作共享全局上限时使用 Semaphore。可先 Effect.makeSemaphore(5) 创建最大 5 并发的信号量,再对每个请求用 semaphore.withPermits(1)(handleRequest(req)),外层 Effect.all 可设 concurrency: 'unbounded',实际并发由信号量控制。
信号用法:用 Deferred 等待另一 fiber 的特定事件或值。创建 Deferred.make<void>(),worker 中 Deferred.await(signal) 等待,主流程 setup() 后 Deferred.succeed(signal, undefined) 触发,再 Fiber.join(worker)。
常见错误:在 Effect.all 中遗漏 { concurrency: n } 导致无界并行;fork 后不 join 或中断导致 fiber 泄漏(可用 Effect.scoped);信号量或 deferred 之间的循环依赖造成死锁。警示信号:大数组上不使用并发上限;在 Effect-TS 代码库中使用 Promise.all;用 setTimeout 手动限流而非 Effect.makeRateLimiter 或 Semaphore。
限制:资料未提供具体价格、平台支持范围及更完整的 API 细节,暂未提供。