python 3.7 aiohttp をつかって並列リクエスト

最近あまり python を触ってなくて、久しぶりに見に行ったら async/await keyword が増えてた。さっそく http で並列リクエストしてみる。

asyncio をベースにした http library aiohttp を使った。

import aiohttp
import asyncio


async def req(url):
    async with aiohttp.ClientSession() as client:
        async with client.get(url) as resp:
            await resp.text()
            print(f"ok: {url}")

if __name__ == '__main__':
    reqs = [req("https://python.org"), req("https://google.com"), req("https://yahoo.jp")]
    wait = asyncio.wait(reqs)

    loop = asyncio.get_event_loop()
    loop.run_until_complete(wait)
  • asyncio.wait(...) は Node.js でいう Promise.all(...) にあたるもの
  • async with というのは、enter, exit 時に coroutine を実行できる context manager らしい。まぁ Go でいう req.Do -> defer resp.Close() みたいな部分と同じようにそういうイディオムだなって覚えてしまうのが良いか
  • しかし、async with でネストが深くなるの、嫌だな〜。。