読者です 読者をやめる 読者になる 読者になる

愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

Pythonのasyncioで(結果を待たない非同期実行|投げっぱなしジャーマン|fire and forget)する

Python asyncio

Pythonは3.5から、C#みたいなasync/awaitを用いた非同期処理が可能になっている。

これ系のパターンでは「非同期処理を待つ」ためにawaitキーワードを使い、「(awaitを含む) 非同期処理が行われる関数をマークする」ためにasyncキーワードを使う。非同期処理の終了は行儀よくawaitで待ち受けるのが普通だが、時には単に非同期処理を投げっぱなしにしたいこともある。ログを書くとか、通知を飛ばすとか。

C#においてはasyncかつ返り値をvoidにすればawaitせずにコールできる非同期メソッドが書ける(逆に言うと、awaitする必要がある非同期メソッドはTaskかTaskを返すということになっている)のだが、pythonだとぱっと見どうすれば同じことが出来るのか分からない。その上、われわれ日本人にはどういう単語で検索すればいいかよくわからない。

知ってる人は「fire and forget」とかで検索すればいいのだが、これは一度どこかで見て覚えていなければどうしようもない類の知識なので、わざわざ日本語で検索しやすいようにとこんな記事を書いているのだ、という長い前置き。

次のようにすればオッケー。(以下のコードはそのままコピペして動くものではなく、あくまで「例」)

import asyncio

async def hogehoge():
     pass

asyncio.ensure_future(hogehoge())

使いようによってはensure_futureには落とし穴があったりするんだけど、それはまた別の機会に。