API reference@evolu/commonTask › createSemaphore

function createSemaphore(permits: Concurrency): Semaphore;

Defined in: packages/common/src/Task.ts:2469

Creates a Semaphore that limits concurrent Tasks.

Example

await using run = createRun();

const semaphore = createSemaphore(PositiveInt.orThrow(2));

const fetchUser =
  (id: string): Task<string> =>
  async (run) => {
    const { console } = run.deps;
    console.log("[demo]", "start", id);
    const slept = await run(sleep("10ms"));
    if (!slept.ok) return slept;
    console.log("[demo]", "end", id);
    return ok(`user:${id}`);
  };

const fetchWithPermit = (id: string) => semaphore.withPermit(fetchUser(id));

await Promise.all([
  run(fetchWithPermit("1")),
  run(fetchWithPermit("2")),
  run(fetchWithPermit("3")),
]);

// [demo] start 1
// [demo] start 2
// [demo] end 1
// [demo] start 3
// [demo] end 2
// [demo] end 3