Open4

Pythonの非同期処理、JavaScriptとの比較

nakaakistnakaakist

ひとまずGPT4

javascriptのasync/awaitとpythonのasync/awaitの違いを説明して

JavaScriptとPythonのasync/awaitは、どちらも非同期プログラミングを簡潔で読みやすい形式で行うための構文を提供しています。しかし、それらが属する言語の背景、動作メカニズム、および関連するエコシステムの違いにより、いくつかの違いが存在します。

以下に、JavaScriptとPythonのasync/awaitの主な違いを挙げます:

背景と基盤:

JavaScript: JavaScriptのasync/awaitは、Promiseを基にしています。awaitはPromiseを解決するために使われ、async関数は常にPromiseを返します。
Python: Pythonのasync/awaitは、コルーチンとasyncio(または他の非同期ライブラリ)のエコシステムを基盤としています。

エラーハンドリング:

JavaScript: 非同期関数内で発生するエラーは、拒否されたPromiseとして伝播します。これを捕捉するためには.catch()またはtry/catchブロックを使用します。
Python: 非同期関数内でのエラーは例外として送出され、通常のtry/exceptブロックを使用して捕捉します。
呼び出しと実行:

JavaScript: async関数を呼び出すと、すぐにPromiseが返されます。
Python: async関数を呼び出すと、コルーチンオブジェクトが返されます。このコルーチンを実際に実行するためには、非同期ループを使ってスケジュールする必要があります。

タスクの並行実行:

JavaScript: Promise.all()やPromise.race()などの関数を使用して、複数の非同期タスクを並行して実行することができます。
Python: asyncio.gather()やasyncio.wait()などの関数を使用して、複数のコルーチンを並行して実行します。

動作環境:

JavaScript: ブラウザやNode.jsなどのJavaScript実行環境で動作します。
Python: 特定の非同期フレームワークやライブラリ(主にasyncio)の下で動作します。
結論として、JavaScriptとPythonのasync/awaitは、非同期プログラミングを直感的に行うための構文的糖衣としての役割は同じですが、それぞれの言語のエコシステムと基盤技術の違いから、いくつかの動作や利用方法に差異があります。

nakaakistnakaakist

pythonでは、コルーチンが言語仕様、その実行はライブラリが担う。
javascriptではasync関数をawaitしなくても実行されるが、pythonでは何かしら明示的にライブラリを使ってスケジュールしないといけない。

nakaakistnakaakist

参考になりそうな記事: https://zenn.dev/knowhere_imai/articles/ba850780152b01

  • asyncioでコルーチンを実行した場合、シングルスレッドになる。
    • jsと近い
  • asyncioでコルーチン実行するには、大元のコルーチンに対してasyncio.runを適用する
    • これによりイベントループが作成される。
  • コルーチンに対してasyncio.create_taskを適用すると、その時点でコルーチンの実行が始まる
    • ただし、当然イベントループがすでにあることが前提となる。
    • task = asyncio.create_task([コルーチン])として実行を開始した後に、await taskとすると、そのタスクの実行完了を待つことができる。(await [コルーチン]でも実行して完了を待つことはできる)
    • taskにすることによって、複数のコルーチンを同時に走らせることが可能になる
  • 下記のようにTaskGroupを使うと、Promise.all的な挙動が実現できる
async with asyncio.TaskGroup() as tg:
        task1 = tg.create_task(...)
        task2 = tg.create_task(...)