[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Task](https://evolu.dev/docs/api-reference/common/Task) › createSemaphore

```ts
function createSemaphore(permits: Concurrency): Semaphore;
```

Defined in: [packages/common/src/Task.ts:2469](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2469)

Creates a [Semaphore](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore) that limits concurrent [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task)s.

### Example

```ts
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
```