Supervisor
Supervisor<A>は、ファイバーの作成と終了を管理し、その監視に基づいて型 A のいくつかの可視値を生成するためのツールです。
作成
track
スーパーバイザーを作成するには、Supervisor.track関数を使用します。この関数は、子ファイバーをセットで管理する新しいスーパーバイザーを生成します。
監視
supervised
エフェクトを監視する必要がある場合は、Effect.supervised関数を使用できます。この関数はスーパーバイザーを受け取り、元のエフェクトと同様に動作するエフェクトを返します。ただし、このエフェクト内でフォークされたすべての子ファイバーは、指定されたスーパーバイザーに報告されます。
これにより、子ファイバーの動作を提供されたスーパーバイザーに関連づけることができ、スーパーバイザーを介してこれらの子ファイバーに関するすべての情報にアクセスできるようになります。
例
以下の例では、アプリケーションのライフサイクル全体でファイバーの数を定期的に監視します:
import { Effect, Supervisor, Schedule, Fiber, FiberStatus } from "effect";
const program = Effect.gen(function* () { const supervisor = yield* Supervisor.track; const fibFiber = yield* fib(20).pipe( Effect.supervised(supervisor), Effect.fork ); const policy = Schedule.spaced("500 millis").pipe( Schedule.whileInputEffect((_) => Fiber.status(fibFiber).pipe( Effect.andThen((status) => status !== FiberStatus.done) ) ) ); const monitorFiber = yield* monitorFibers(supervisor).pipe( Effect.repeat(policy), Effect.fork ); yield* Fiber.join(monitorFiber); const result = yield* Fiber.join(fibFiber); console.log(`fibonacci result: ${result}`);});
const monitorFibers = ( supervisor: Supervisor.Supervisor<Array<Fiber.RuntimeFiber<any, any>>>): Effect.Effect<void> => Effect.gen(function* () { const fibers = yield* supervisor.value; console.log(`number of fibers: ${fibers.length}`); });
const fib = (n: number): Effect.Effect<number> => Effect.gen(function* () { if (n <= 1) { return 1; } yield* Effect.sleep("500 millis"); const fiber1 = yield* Effect.fork(fib(n - 2)); const fiber2 = yield* Effect.fork(fib(n - 1)); const v1 = yield* Fiber.join(fiber1); const v2 = yield* Fiber.join(fiber2); return v1 + v2; });
Effect.runPromise(program);/*Output:number of fibers: 0number of fibers: 2number of fibers: 6number of fibers: 14number of fibers: 30number of fibers: 62number of fibers: 126number of fibers: 254number of fibers: 510number of fibers: 1022number of fibers: 2034number of fibers: 3795number of fibers: 5810number of fibers: 6474number of fibers: 4942number of fibers: 2515number of fibers: 832number of fibers: 170number of fibers: 18number of fibers: 0fibonacci result: 10946*/