0Pricing
JavaScript Academy · レッスン

マクロタスクとタスクキュー

タイマーや I/O がどのようにスケジュールされるかを理解します。

「マクロタスクとタスクキュー」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。

マクロタスクとは

マクロタスク(単にタスクとも呼ばれます)は、現在の同期コードが完了した後で実行されるようスケジュールされた作業単位です。setTimeoutのコールバックが典型的な例です。

マクロタスクは、コールスタックが空になるまでタスクキューで待機します。

setTimeoutは処理を遅延させる

setTimeoutは、後で実行するコールバックを登録します。遅延時間が0であっても、現在のすべての同期コードが終わった後に実行されます。

console.log('first');
setTimeout(() => console.log('third (timeout)'), 0);
console.log('second');

タスクキュー

タイマーが発火すると、そのコールバックがタスクキューに入ります。イベントループは、コールスタックが空になったときだけこのキューから1つのタスクを取り出し、完了するまで実行してから、再び確認します。

console.log('sync start');
setTimeout(() => console.log('task 1'), 0);
setTimeout(() => console.log('task 2'), 0);
console.log('sync end');

タスクはキューに入った順に実行される

同じ遅延時間のタスクは、スケジュールされた順に実行されます。タスクキューはFIFO、つまり先入れ先出しです。

setTimeout(() => console.log('A'), 0);
setTimeout(() => console.log('B'), 0);
setTimeout(() => console.log('C'), 0);
console.log('sync');

遅延時間は正確な時間ではなく最小時間

指定した遅延時間は、コールバックが実行可能になるまでの最小時間です。実際の実行は、スタックが空になり、それより前のタスクが完了してから行われるため、さらに後になる場合があります。

setTimeout(() => console.log('100ms'), 100);
setTimeout(() => console.log('0ms'), 0);
console.log('synchronous runs first');

遅延時間による並べ替え

遅延時間が異なると順序も変わります。短い遅延のタスクほど早く実行可能になるため、通常はスケジュールされた順序に関係なく、長い遅延のタスクより先に実行されます。

setTimeout(() => console.log('50'), 50);
setTimeout(() => console.log('10'), 10);
setTimeout(() => console.log('30'), 30);
console.log('start');

ループ1回につき1つのタスク

イベントループは1回のターンにつき、正確に1つのマクロタスクを実行し、その後、次のターンまでにほかの処理を行います。これにより、タスクの間もシステムの応答性が保たれます。

console.log('1');
setTimeout(() => {
  console.log('2');
  setTimeout(() => console.log('4'), 0);
}, 0);
setTimeout(() => console.log('3'), 0);

ネストしたタイマーは後でキューに入る

タスク内でスケジュールされたタイマーは、すでに待機しているタスクの後ろにキューへ追加されるため、後のループターンで実行されます。

setTimeout(() => {
  console.log('outer');
  setTimeout(() => console.log('inner nested'), 0);
}, 0);
setTimeout(() => console.log('sibling'), 0);

setIntervalもマクロタスク

setIntervalは、繰り返し実行されるマクロタスクをスケジュールします。ここでは数回だけ反復して、clearIntervalで停止し、出力が増えすぎないようにします。

let count = 0;
const id = setInterval(() => {
  count++;
  console.log('tick ' + count);
  if (count === 3) clearInterval(id);
}, 10);
console.log('interval scheduled');

同期処理が常に優先される

遅延時間がどれほど短くても、すべてのマクロタスクは現在の実行中にある同期コードの後で待機します。まずスタックが空にならなければなりません。

setTimeout(() => console.log('macrotask'), 0);
for (let i = 1; i <= 3; i++) console.log('sync ' + i);
console.log('done sync');

マクロタスクが重要な理由

マクロタスクを使うと、処理をブロックせずに後回しにできます。負荷の高い処理を時間指定の小さな単位に分割すると、アプリの応答性を保てます。ただし、マクロタスクが最優先というわけではありません。次に学ぶマイクロタスク(Promise)は、次のマクロタスクより先に実行されます。

console.log('schedule');
setTimeout(() => console.log('runs after sync'), 0);
console.log('still sync');

理解度チェック

setTimeout(cb, 0)のコールバックはいつ実行されますか。

まとめ:マクロタスク

遅延された処理がスケジュールされる仕組みを学びました。

  • マクロタスク(setTimeout、setInterval)はタスクキューで待機します。
  • キューはFIFOであり、イベントループは1ターンにつき1つのタスクを実行します。
  • 遅延時間は最小時間であり、同期コードが常に先に実行されます。
  • マイクロタスクの優先度はより高く、次に詳しく学びます。

よくある質問

「マクロタスクとタスクキュー」レッスンは無料ですか?

はい。「マクロタスクとタスクキュー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「マクロタスクとタスクキュー」で何を学びますか?

タイマーや I/O がどのようにスケジュールされるかを理解します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「マクロタスクとタスクキュー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コールスタック
  2. マクロタスクとタスクキュー
  3. マイクロタスクと Promise
  4. queueMicrotask と実行順序
← JavaScript Academyに戻る