当サイトは、アフィリエイト広告を利用しています

【Python × JavaScript】非同期処理の違いを整理する

作成日:2026月03月06日
更新日:2026年03月06日

Pythonで非同期処理async/awaitを書いていて
何か、jsのasync/awaitとは違うような気がしたので少し調べてみた。

当記事では

  • javascriptにおける非同期処理の仕組み
  • pythonにおける非同期処理の仕組み
  • 共通点
  • 相違点

を構造的に整理する

javascriptにおける非同期処理の仕組み

JavaScriptの非同期処理は、イベントループを中心とした実行モデルで成り立っていて
本質は Promise とイベントループにある。

javascriptにおいては

  • 非同期処理(async)
  • await

は分けて考えるておくことで、Pythonと比較する時に理解しやすい

javascriptにおける非同期処理(async)

非同期処理
async function main() {
console.log("start");
fetch("/api/user");
console.log("end");
}

この場合、fetch()はPromiseを返す関数であるため、処理フローは

  1. main() が実行される
  2. start が表示される
  3. fetch() が 実行される
  4. end が表示される
  5. fetch() が Promise を返す

のようにfetch()の処理を待たずに実行されていく。

JavaScriptにおける非同期処理は

  • Promiseベースで進行する処理を、イベントループが切り替えながら扱う仕組み

awaitを付けなくてもPromise自体は生成され、処理は進行する。

javascriptにおけるawait

await
async function main() {
console.log("start");
await fetch("/api/user");
console.log("end");
}

とした場合の処理フローは

  1. main() が実行される
  2. fetch() が Promise を返す
  3. await に到達する
  4. main() は一時停止し、Promiseの完了を待つ。
  5. その間に他の処理が進む
  6. fetch() の完了後、main() の続きが再開される

となる。

JavaScriptにおけるawaitは

  • javascriptの非同期処理をを同期処理のような見た目で書けるようにした構文糖衣

であり、 非同期処理を開始するための構文ではなく、
すでに開始されている Promise の完了を待つための構文である。

pythonにおける非同期処理の仕組み

Pythonの非同期処理もjavascriptと同様に、イベントループを中心とした実行モデルで成り立っているが Pythonにおいては

  • 非同期処理(async)
  • await

はセットで考える必要がある。
※Pythonにおいてawaitの役割が異なる。

pythonにおける非同期処理(async/await)

Pythonでは async def を用いて非同期関数を定義する。
※これをコルーチンと呼ぶ

コルーチン
async def fetch_user():
...
coro = fetch_user()
  • コルーチンは呼び出すだけでは実行されない
  • この時点で得られるのは コルーチンオブジェクト
  • まだ処理は実行されていない。

つまりPythonでは

  • コルーチンを呼び出しただけでは処理は開始されない

という特徴がある。

コルーチンの実行

実際に処理を実行するためには、

  • await

を使ってイベントループに登録する必要がある。

コルーチン実行
async def main():
await fetch_user()
  • await に到達すると、コルーチンはイベントループに登録され実行される。

概念的な流れは次のようになる。

  1. コルーチン生成
  2. awaitでイベントループに登録
  3. コルーチン実行
  4. awaitで一時停止
  5. 他タスクへ切り替え
  6. 再開

Pythonの非同期処理は

  • コルーチン(Coroutine)
  • タスク(Task)
  • イベントループ(Event Loop)

という構造で実現されている。 Pythonの標準実装では、この仕組みは asyncio モジュールによって提供されている。

awaitつけないと

Pythonでは await されないコルーチンが存在すると警告が発生する。

awaitなしコルーチン
fetch_user()

このようにコルーチンを生成しただけで放置すると

警告
RuntimeWarning: coroutine was never awaited

という警告が出る。 これはコルーチンが実行されないまま破棄される可能性があるためである。

つまりPythonの await

  • コルーチンを実行する
  • 処理の完了を待つ

という 2つの役割 を持つ。
※コルーチンは await されるか Task としてスケジュールされない限り実行されない。

共通点

ここまで見てきたように、 JavaScriptとPythonの非同期処理にはいくつかの共通点がある。

まず両者とも イベントループ型の並行処理モデル を採用している。

このモデルでは

  • 1つのスレッドが
  • I/O待ちで処理を停止し
  • その間に他の処理を進める

ことで並行処理を実現している。

つまり両言語とも

  • 非同期処理
  • イベントループ
  • async / await

という仕組みによって、 I/O待ち時間を効率的に利用する設計になっている。

また重要な点として

  • 両者とも並列処理(parallelism)ではなく並行処理(concurrency)である。

CPUを同時実行しているわけではなく、
イベントループによって処理を切り替えている。

相違点

ここまでの内容を踏まえると、 JavaScriptとPythonの非同期処理の最大の違いは

  • 実行開始タイミング

にある。

JavaScript実行開始タイミング

JavaScriptでは

  • Promiseは生成された時点

で処理が開始される

JavaScript実行開始タイミング
fetch("/api/user");

この例では

  • この時点でHTTPリクエストは開始されている。
  • awaitはなくても実行される
  • await はその完了を待つかどうかを決める構文であるため実行とは関係がない。

Python実行開始タイミング

一方、Pythonではコルーチンは await されるまで実行されない

コルーチン生成
fetch_user()

このコードではコルーチンオブジェクトが生成されるだけで、 処理はまだ開始されない。

実行するには

コルーチン実行
await fetch_user()
  • awaitをつけることで実行される

JavaScriptとPythonの非同期処理の違いまとめ

違いを整理すると、次のようになる。

JavaScriptの非同期処理の仕組み

  • 非同期処理の基盤:Promise
  • 実行開始:Promise生成時
  • awaitの役割:Promiseの完了を待つ
  • awaitしない場合:非同期処理自体は実行される

Pythonの非同期処理の仕組み

  • 非同期処理の基盤:Coroutine
  • 実行開始:await時
  • awaitの役割:コルーチンの実行+完了待機
  • awaitしない場合:コルーチンは実行されない

まとめ

つまり

  • JavaScriptでは非同期処理は「自動で走る処理」
  • Pythonでは「明示的に実行する処理」

となる。

この設計の違いにより、
JavaScriptでは await を付けなくても非同期処理は進行するが、
Pythonでは await を付けないとコルーチンが実行されず警告が発生する。

補足:FastAPIでの非同期処理

なお、FastAPIなどのPythonの非同期Webフレームワークでは、
エンドポイント関数自体は内部で await されて実行されている。
詳細は下記記事

そのためエンドポイント関数内でさらに非同期処理を行う場合は、
明示的に await を付ける必要がある。

新着記事

タグ一覧
top