url: https://cybozu.dev/ja/tutorials/hello-js/promise/
title: "Promiseとasync/awaitで非同期処理をしてみよう"
description: "コードが実行される順番を知る上で重要な、同期処理や非同期処理、Promiseを学びましょう。"
host: cybozu.dev
image: https://cybozu.dev/img/ogp.png

同期処理と非同期処理

プログラムの文脈において、上から下に逐次的に処理を実行するのが 同期処理 です。 一方、 非同期処理 ではある処理 X について、その処理 X を待たずに他の処理 Y, Z, W, … に進むものです。

ここで、非同期処理について「どう実現するか」は定義されていない ということが重要です。

並行処理と並列処理

url: https://qiita.com/Kiyo_Karl2/items/858f1b2b5ce55216c446
title: "並行・並列・スレッド・プロセスなどのワードについてまとめてみた - Qiita"
description: "概要 現在、Go言語のgoroutineの仕組みについて学習しているのですが、その際の前提知識となってくる 並行・並列 マルチプロセス・マルチスレッド マルチコア・マルチプロセッサ 上記のコンピュータの基礎知識についてまとめてみました。 この記事や参考文献について理解..."
host: qiita.com
favicon: https://cdn.qiita.com/assets/favicons/public/production-c620d3e403342b1022967ba5e3db1aaa.ico
image: https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg%3Fixlib%3Drb-4.0.0%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnFpaXRhLWltYWdlLXN0b3JlLnMzLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20lMkYwJTJGNjMyNjc4JTJGcHJvZmlsZS1pbWFnZXMlMkYxNTk0MzYzNTY0P2l4bGliPXJiLTQuMC4wJmFyPTElM0ExJmZpdD1jcm9wJm1hc2s9ZWxsaXBzZSZiZz1GRkZGRkYmZm09cG5nMzImcz1lNTM0MTYxMmFmZGQ2N2U3ZDlhOGJjOTI2MTY2MTg2ZA%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3Df270b4813eec22cebc5dcdd8d2d865e7?ixlib=rb-4.0.0&w=1200&fm=jpg&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk2MCZoPTMyNCZ0eHQ9JUU0JUI4JUE2JUU4JUExJThDJUUzJTgzJUJCJUU0JUI4JUE2JUU1JTg4JTk3JUUzJTgzJUJCJUUzJTgyJUI5JUUzJTgzJUFDJUUzJTgzJTgzJUUzJTgzJTg5JUUzJTgzJUJCJUUzJTgzJTk3JUUzJTgzJUFEJUUzJTgyJUJCJUUzJTgyJUI5JUUzJTgxJUFBJUUzJTgxJUE5JUUzJTgxJUFFJUUzJTgzJUFGJUUzJTgzJUJDJUUzJTgzJTg5JUUzJTgxJUFCJUUzJTgxJUE0JUUzJTgxJTg0JUUzJTgxJUE2JUUzJTgxJUJFJUUzJTgxJUE4JUUzJTgyJTgxJUUzJTgxJUE2JUUzJTgxJUJGJUUzJTgxJTlGJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LXBhZD0wJnM9MDA3MTViNDQ3NjA3MGYyODNmYThlZmNjZmVkYmZmYTU&mark-x=120&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTgzOCZoPTU4JnR4dD0lNDBLaXlvX0thcmwyJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LXBhZD0wJnM9YjBjMTM1ZjM3NDNjN2IxODcwYTY1MzczY2NhODc5YzE&blend-x=242&blend-y=480&blend-w=838&blend-h=46&blend-fit=crop&blend-crop=left%2Cbottom&blend-mode=normal&s=61967d6a1c8d7b6d9f82ff7fe41f316e

前提として、 1 つの CPU はある 1 時点において 1 つのプロセスしか実行できません。 それでも異なるプロセスの処理 (ウィンドウアプリケーション・CLI・デーモン) が同時に実行されているようにみえます。 これは、 OS スケジューラが単一 CPU へ複数のプロセスを絶え間なく順番に割り当てることで「同時に実行されているようにみせかける」を実現しています。これが 並行処理 です。 OS スケジューラが CPU へプロセスを非常に短い時間ずつ割り当てるのを コンテキストスイッチ とよび、裏でずっと頑張っています。

一方で、2025 年現在 CPU はマルチコアであることが普通です。 各コアはそれぞれ独立して OS スケジューラから処理すべきプロセスが割り当てられます。 ある 1 時点において複数の CPU コアで同時に処理されている、のが 並列処理 です。

ここで、 X コアあるけど実行すべきプロセスが 1 つしかない場合、 X - 1 コアが余ってしまいます。 このようにマルチコアで効率的に処理が行えるように スレッド というものがあります。 1つのプロセス内に複数のスレッドを構築でき、そして CPU には 1 つのスレッドを処理として実は割り当てられます

よって、 X コアあって、プロセスが1つであり、そのプロセスが X スレッドの場合、うまく OS スケジューラが働けば各コアが 1 つのスレッドを処理できます。 CPU として非常に重い処理があったときに、メインスレッドから生成したバックグラウンドスレッドに処理を移譲しマルチコアで処理すれば、UI/UX を悪化させずに処理できます。

同期・非同期処理と並列・平行処理は別物

非同期処理の実現方法は様々です。

  • 並列処理で実現したい場合: バウンドな処理を裏側のスレッドに流し、マルチコアで同時に処理させます。
  • 並行処理で実現したい場合: 待機を移譲し、メインスレッドはそのまま後続の別のタスク( 更新など)を実行します。

ここで、同期処理においても並列処理は実現できることに注意です。 どの視点で処理を見るかですが、サブスレッド側で重い処理を実現する、これはそのマルチコアが逐次的に処理を待っている、といえます。

よって、同期処理でも並列・並行処理に該当することがあるため注意です。