AIOHTTP Client デモ -------------------- - `PokéAPI `_ を使ってポケモンを150匹Getする方法を3つ紹介し処理の速さを比較する - 参照:`aiohttpとasyncioを使用したPythonの非同期HTTPリクエスト `_ - PokéAPIについて - 利用規約 `Documentation - PokéAPI `_ - endpoint: https://pokeapi.co/docs/v2#pokemon - API例: - https://pokeapi.co/api/v2/pokemon/25 : id 25 の ピカチュウ情報URL Requests を使った場合 ~~~~~~~~~~~~~~~~~~~~~~ - `Requests `_ を使って通常のHTTPリクエストでAPIへアクセスする .. code-block:: bash $ pip install requests .. literalinclude:: ./code/aiohttp/pokemon1.py :linenos: 実行結果: ``time: 5.970675468444824`` 非同期にリクエストをする場合 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``await resp.json()`` でbody をjsonで要求。 - bodyを待っている間に、後続のポケモンURL - jsonが返ってきたら、URLを投げている処理を一旦止めて、ポケモン ID と name を出力 .. literalinclude:: ./code/aiohttp/pokemon2.py :linenos: 実行結果: ``time: 2.4725234508514404`` タスクリストを先に作って非同期にリクエストする場合 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - まずは非同期リクエスト用のタスクリストを作成し、 `asyncio.create_task `_ へ渡す。 - このタスクリストを `asyncio.gather `_ へ渡して全てのタスクを並行に実行する。この実行を `await` して全部完了するまで待つ。返り値の順序は、``create_task`` で作った順序と同じ。 .. literalinclude:: ./code/aiohttp/pokemon3.py :linenos: 実行結果: ``time: 0.4347381591796875`` - 返り値の順番は気にせず、通信が終わった順に取得する場合 .. literalinclude:: ./code/aiohttp/pokemon4.py :linenos: