Pythonでaiohttpを使用し非同期リクエストを行ってみます。
aiohttpは、asyncioとPythonのための非同期型HTTPクライアント/サーバーです。
今回はaiohttpのライブラリをインストールします。なお、aiohttpのライブラリは、Pythonの標準ライブラリではありませんの事前にインストールする必要があります。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)
■aiohttpをインストールする
aiohttpをインストールを行いますが、今回はpipを経由してインストールを行うので、まずWindowsのコマンドプロンプトを起動します。
pip install aiohttp
起動後、上記のコマンドを入力し、Enterキーを押します。
なお、今回は、pythonランチャーを使用しており、Python Version 3.8.5にインストールを行うために、pipを使う場合にはコマンドでの切り替えを行います。
py -3.8 -m pip install aiohttp
切り替えるために、上記のコマンドを入力し、Enterキーを押します。
Defaulting to user installation because normal site-packages is not writeable
Collecting aiohttp
Downloading aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl (635 kB)
|████████████████████████████████| 635 kB 1.1 MB/s
Requirement already satisfied: chardet<5.0,>=2.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from aiohttp) (4.0.0)
Requirement already satisfied: attrs>=17.3.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from aiohttp) (21.2.0)
Collecting yarl<2.0,>=1.0
Downloading yarl-1.6.3-cp38-cp38-win_amd64.whl (125 kB)
|████████████████████████████████| 125 kB 2.2 MB/s
Collecting async-timeout<4.0,>=3.0
Downloading async_timeout-3.0.1-py3-none-any.whl (8.2 kB)
Collecting multidict<7.0,>=4.5
Downloading multidict-5.1.0-cp38-cp38-win_amd64.whl (48 kB)
|████████████████████████████████| 48 kB 1.4 MB/s
Collecting typing-extensions>=3.6.5
Downloading typing_extensions-3.10.0.0-py3-none-any.whl (26 kB)
Requirement already satisfied: idna>=2.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from yarl<2.0,>=1.0->aiohttp) (2.10)
Installing collected packages: multidict, yarl, async-timeout, typing-extensions, aiohttp
Successfully installed aiohttp-3.7.4.post0 async-timeout-3.0.1 multidict-5.1.0 typing-extensions-3.10.0.0 yarl-1.6.3
Enterキーを押すと、インストールが開始され、上記のように「Successfully installed」と表示されます。これが表示されれば、aiohttpが正常にインストールされたことになります。
なお、今回はaiohttpのバージョン3.7.4.post0をインストールしました。
■非同期リクエストを行う
インストール後、aiohttpを使用し非同期リクエストを行ってみます。
■コード
import aiohttp import asyncio async def main(): async with aiohttp.ClientSession() as session: async with session.get('https://www.yahoo.co.jp/') as response: print("Status:",response.status) print("Content-type:",response.headers['content-type']) html = await response.text() print("Body:",html,"...") loop = asyncio.get_event_loop() loop.run_until_complete(main())
非同期処理を行なう際にはasyncioモジュールをimportで呼び出しています。
aiohttp.ClientSession()をsession変数にして、HTTP リクエスト(GETメソッド)を送信し、サーバーから返ってきた情報をresponse変数に格納。格納したものをprint()関数で出力します。なお、今回HTTP リクエスト(GETメソッド)を送信するサーバー(URL)は、Yahoo!JAPAN(https://www.yahoo.co.jp/)を指定しています。
loop変数を作成し、asyncio.get_event_loop()関数で、現在のイベント ループを取得。
loop.run_until_complete()関数を使用し、非同期処理が行われているmain()関数が、完了するまで実行します。
■実行
このスクリプトを「asynchronous_request.py」という名前で保存し、コマンドプロンプトから実行してみます。
実行してみると、aiohttpモジュールとasyncioモジュールを使用することで、非同期リクエストが行われて、今回指定したサーバー(URL)のステータスコードやコンテンツの情報が返され、出力することができました。
コメント