はじめに
asyncioはasync/await構文を使い、並行処理のコードを書くためのライブラリです。
基本的な概念
イベントループ
イベント(何らかのアクション)を待機するためのメカニズムです。
コルーチン
途中で実行を止めることができる関数のようなもの
だと理解してください。
実践
コルーチンの実行
まずは、基本であるコルーチンを動かしてみましょう。
コルーチンの実行方法は3つありますが、Python3.6
で書くと以下のようになります。
(3.7
以降では、asyncio.run()
やasyncio.create_task()
ができる)
コルーチンの宣言は簡単で、通常の関数のように宣言を行えば良いです。
ただし、def
の前にasync
を付けます。
コード
1 | import asyncio |
start
と出力し、1秒待ったのちend
と出力するコルーチンf
を定義し、3つの方法で実行しました。
タスク
さて、これだと通常の関数と比較した際のメリットが全く見えませんね。
そこでタスク
を複数使って、非同期な処理を実装してみましょう。
コード
1 | import asyncio |
実行結果を見るとわかるのですが、task1
の終了を待たずしてtask2
の実行が始まっていることが確認できます。
await
とは
ここでawait
が何者なのか考えましょう。
先ほどのコルーチンg
を書き換えます。
コード
1 | async def g(): |
今度は期待するような非同期処理が行われなかったはずです。
これはtask1
を作成した直後にawait
してしまったためです。
await
は処理が完了するまで、コルーチンやタスクをブロックします。つまり、完了するまでプログラムが進まないということになります。
ただし、何でもかんでもawait
をつけられるわけではなく、awaitable
なオブジェクトにのみ付与が可能なので注意が必要です。
記事情報
- 投稿日:2020年4月6日
- 最終更新日:2020年5月4日