🕒

Node.js でスレッドをブロックして待つ

2023/05/21に公開

Node.js で sleep 的なことをしようと思うと、普通こんな感じになると思う。

import timers from "node:timers/promises";

await timers.setTimeout(1000);

まあこれでも大体の場合良いのだけど、たとえば async じゃない関数の中とかで、スレッドをまるっと止めたいときがある。(スレッド遊びをしているときとかね)

そういうときはタイムアウト付きの Atomics.wait で止められる。

function msleep(n) {
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n);
}

ここから余談。この Atomics.wait、今回の場合は同期的に止まってくれるのがありがたいポイントなのだが、本来の用途としてはスレッドを同期的に止められると困ることがある。そこで最近 Atomics.waitAsync というやつが Stage 4 になった。

Discussion