
Junya Fukuda
3.4K posts

Junya Fukuda
@JunyaFff
SOFTWARE ENGINEER @GROOVEXInc / NAGANO / Podcaster @rerefm / 共著書 「Python実践レシピ」https://t.co/Mnx6wWtT5w 翻訳「エキスパートPythonプログラミング改訂4版」
















では、私が日常的に使っているPythonでお願いします。 -------------------------------------------------- ありがとうございます、Yoshiyukiさん。Pythonでの非同期処理は、特にasyncioやaiohttpなどを使う場面でその本質的な難しさが現れます。ここでは、Pythonにおける非同期処理の難しさを具体例とともに掘り下げてみましょう。 🧵 Pythonの非同期処理が難しい理由と具体例 1. async / await の文法と実行モデルの理解 Pythonでは非同期処理にasync defとawaitを使いますが、これは単なる文法ではなく、イベントループという実行モデルの理解が必要です。 import asyncio async def fetch_data(): print("Fetching...") await asyncio.sleep(2) print("Done!") async def main(): await fetch_data() asyncio.run(main()) await asyncio.sleep(2)は非同期に2秒待つが、他の処理が同時に進められるわけではない。 asyncio.run()でイベントループを開始する必要がある。 👉 難しさのポイント:同期処理と見た目が似ているが、裏ではイベントループが動いている。 2. 並行処理と競合状態の管理 複数の非同期タスクを同時に走らせると、状態の競合が起こりやすくなります。 import asyncio counter = 0 async def increment(): global counter for _ in range(1000): counter += 1 async def main(): await asyncio.gather(increment(), increment()) asyncio.run(main()) print(counter) # 期待値は2000だが、実際はそれ以下になることも 👉 難しさのポイント:非同期でもスレッドセーフではない。asyncio.Lockなどで明示的に保護する必要がある。 3. エラーハンドリングの分散 非同期処理では、例外が非同期に発生するため、通常のtry/exceptでは捕捉しづらいことがあります。 async def risky_task(): await asyncio.sleep(1) raise ValueError("Something went wrong") async def main(): try: await risky_task() except Exception as e: print(f"Caught: {e}") asyncio.run(main()) このようにawaitの外側でtry/exceptを使う必要がある。 asyncio.gather()では、複数の例外が発生する可能性があるため、return_exceptions=Trueを使うことも。 4. デバッグとトレースの困難さ 非同期処理では、スタックトレースが分断されるため、どこで何が起きたかを追うのが難しくなります。 ログ出力のタイミングがズレる awaitの中で例外が発生すると、呼び出し元との関係が見えづらい 👉 対策としては、asyncio.run()の中でloggingを使った詳細なトレースや、contextvarsによるコンテキスト管理が有効です。 🧠 Copilot的アドバイス Pythonで非同期処理を扱う際は、以下のような設計指針が役立ちます: 明示的なロックと状態管理:asyncio.LockやQueueを活用 エラーハンドリングの一元化:try/exceptをawaitの外に置く イベントループの理解:asyncio.run()とcreate_task()の違いを把握 テストとデバッグの工夫:pytest-asyncioやtrioなどのツールも検討 もしご希望があれば、実際のユースケース(Web API呼び出し、ファイルIO、センサーデータの非同期取得など)に合わせたコード例もご紹介できます。どんな場面で非同期処理を使いたいか、教えていただけますか?

本日の資料です!ありがとうございました 開発生産性IPAおいしかったです〜 speakerdeck.com/jrfk/robotutod… #techbaton_findy





