3都市ぶん取ると、待ち時間がそのまま積み重なる
第13章で、tenki は requests を使って Open-Meteo(天気の API)から本物の気温を取れるようになりました。第15章では型ヒントや道具も整えました。次は、東京・大阪・札幌の3都市の天気をまとめて表示したくなります。
素直に書くと、for で1都市ずつ取ることになります(fetch は1都市ぶんを requests で取ってくる関数です)。
for city in CITIES:
print(*fetch(city))これは動きます。ただ、図の上の帯のように、待ち時間が積み重なります。1都市の問い合わせに1秒かかるなら、3都市で約3秒です。東京の返事が来るまで、大阪への問い合わせは始まりません。
JS を書いてきた人なら、ここで Promise.all を思い浮かべるはずです。3つの fetch を同時に出して、全部そろうのを待てば、約1秒で済みます。
Python にも async と await があると聞いて、JS と同じつもりで書いてみると、いきなりつまずきます。
SyntaxError: 'await' outside functionJS なら(ES モジュールでは)ファイルの一番外側でも await が書けたのに、Python では書けません。
この章の疑問はこうです。
| 疑問 | 答えの場所 |
|---|---|
なぜ関数の外で await できない? | ループがあるかどうか(台所のたとえ・JS と Python のループ) |
async def を呼んだのに何も起きないのはなぜ? | コルーチン |
Promise.all はどう書く? | ループの中の5段と gather |
| requests のままでは速くならないのはなぜ? | ループごと止める関数 |
この章は、第15章までの内容(import・pip・venv・pyproject.toml・uv)を前提にします。httpx というライブラリを uv add で入れて使います。
※2026年9月時点(Python 3.13)の情報です。