最近あまり 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
でネストが深くなるの、嫌だな〜。。