📝

【Python】非同期処理(async/await)を理解する

に公開

【Python】非同期処理(async/await)を理解する

作成中〜
これは複雑で難しいので今後修正したり追記する予定

Step 1:非同期の必要性を理解しよう

非同期処理とは、ある処理の完了を待たずに次の処理を実行する方式のことです。
例えば
Webサイトで画像やデータを読み込む際に、読み込みが完了するまで他の操作ができないと、ユーザーは不便を感じます。
非同期処理を使うことで、読み込み中に他のボタンをクリックしたり、スクロールしたりできるようになります。
これにより、処理の効率化やユーザー体験の向上が期待できます。

現実世界の例:コンビニの店員さん

【従来の店員さん(同期)】
お客さん1: レジ会計 → 完全に終わるまで待つ
お客さん2: やっと順番 → また完全に終わるまで待つ
お客さん3: やっと順番...

結果:お客さんが行列で怒ってる😡
【上手な店員さん(非同期)】
お客さん1: 「揚げ物温めますね」→ 温めてる間に
お客さん2: 「こちらのレジどうぞ」→ 会計しながら
お客さん1: 「温まりました!」→ 渡す

結果:みんなスムーズ😊

これが非同期の基本アイデアです!


Step 2: プログラムでも同じことが起きる

問題:ウェブサイトが遅い

ユーザーがボタンを押す
↓
「データベースから情報取得中...」(3秒)
↓
この間、画面が固まって何もできない😰
↓
やっと結果表示

解決:非同期処理

ユーザーがボタンを押す
↓
「データベースから情報取得中...」(裏で処理)
↓
この間も、他のボタンは押せる😊
↓
取得完了したら結果表示

Step 3:最初の最小コード

import asyncio

async def say_hello():
    return "Hello"

async def main():
    result = await say_hello()
    print(result)

asyncio.run(main())

実行結果: Hello


最小限のコード例2: 待つ処理

import asyncio

async def fetch_data():
    print("Start fetching...")
    await asyncio.sleep(2)
    print("Fetching done!")
    return "data"

async def main():
    result = await fetch_data()
    print(result)

asyncio.run(main())

実行結果:

Start fetching...
(2秒後)
Fetching done!
data

Step 4:awaitの意味を体験

import asyncio

async def fetch_user():
    print("Start fetching user...")
    await asyncio.sleep(1)
    print("User fetched!")
    return {"id": 1, "name": "john"}

async def main():
    user = await fetch_user()
    print(user)

asyncio.run(main())

実行結果:

Start fetching user...
(1秒後)
User fetched!
{'id': 1, 'name': 'john'}

await = 「この処理の完了を待って」という意味


Step 5:awaitを忘れたらどうなる?

import asyncio

async def fetch_user():
    await asyncio.sleep(1)
    return {"id": 1, "name": "john"}

async def main():
    user = fetch_user()  # ❌ await忘れ
    print(user)

asyncio.run(main())

実行結果:

# 変な文字が出力される
<coroutine object fetch_user at 0x...>

Step 6:正しくawaitをつける

import asyncio

async def fetch_user():
    await asyncio.sleep(1)
    return {"id": 1, "name": "john"}

async def main():
    user = await fetch_user()  # ✅ awaitつけた
    print(user)

asyncio.run(main())

実行結果:

{'id': 1, 'name': 'john'}
GitHubで編集を提案

Discussion