はじめに
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日