kyohei's blog

profile picture
Written by Kyohei Tsukuda who lives and works in Tokyo 🇯🇵 , building useful things 🔧.
email / facebook / X / GitHub

async-semaについて

September 10, 2020 - Async JavaScript

Java や C++などではマルチスレッドプログラミングではセマフォを使った実装はよくありますが、JavaScript では以下のようなケースでセマフォを利用したくなることがあります

async-sema は JavaScript の async-await でセマフォを実装したライブラリです。

Usage

以下の例は 20 個分の要素(データ)を最大 3 つずつ同時に処理する例です

const { Sema } = require('async-sema');

const wait = () => new Promise((resolve) => setTimeout(resolve, 1000));

async function main() {
  const items = [];

  for (let i = 0; i < 20; i++) items.push(i + 1);

  const s = new Sema(3);
  await Promise.all(
    items.map(async (elem) => {
      await s.acquire();
      console.log(elem, s.nrWaiting());
      await wait();
      s.release();
    })
  );
  console.log('done');
}

main();

要点は3つで

全体を Promise.all でラップします。

s.nrWaiting() で残りの処理数を出力します。

その他のオプション

コンストラクタで用意されている引数のオプションには以下の物があります

メソッド