例えば...
コマンドにいろんな機能をつけていくと、例えば外部のAPIをコールしたり、ファイルを読み込んだりすると思います。
ここで、大変重要なことなんですけど、「非同期処理」を忘れないでください!!!!
本当に。
初めて作ったBOTでは、APIコールを全て同期処理で行っていたので、APIコール中に別のコマンド処理が一切できないという問題がありました。
そこでPR貰いながら色々理解しました。
ここでは、「同期処理を非同期処理として実行する方法」については紹介しません。
私が理解しきれていないのと、それを書いてると日が暮れてしまうからです。
では、何を紹介するか?
見落としがちな同期処理について書いていきましょう。
見落としがちな同期処理
ファイル操作
例えば、ファイルを読み込んだりする際に、普通にopen()
とか使ったりしてませんか?
普通のPythonであれば別に何でもいいと思うんですけど、ここは非同期の世界です。
aiofiles
aiofilesというモジュールを使うと、ファイルの操作(読み込み/書き込み)を非同期で行えます。
同期処理であれば
with open('nikki.txt', mode='r') as f:
print(f.read())
という感じに書くものでも、
import aiofiles
async with aiofiles.open('nikki.txt', mode='r') as f:
print(await f.read())
という感じに書く必要があります。
こうしないと、ファイルの読み込みでブロッキングをしてしまうので、ちゃんとaiofiles
で書きましょう。
aiohttp
APIコールとかする時、本当に気をつけないといけません。
通常、requestsなどを使う、ネットワーク関連の操作は、aiohttp
というものを使いましょう。
import requests
resp = requests.get("https://httpbin.org/json")
data = resp.json()
print(data["slideshow"]["author"])
通常、このように書く処理は、
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get("https://httpbin.org/json") as resp:
data = await resp.json()
print(data["slideshow"]["author"])
このように書く必要があります。
こうすることで、リクエストを非同期で行うことができます。
GET以外でも、session.post
とかってすればPOSTも非同期で行えます。
非同期処理があるかも!
今使ってるAPIコール系ライブラリの中にも、もしかしたらドキュメントに載ってない非同期処理があるかもしれません。
まずは、ライブラリのGitHub(ソースコード)を見てみてください。
async
とかがあればきっとそこら辺が非同期処理かもしれません。
実際、よく使っているライブラリのa2s
やmcstatus
の中にも非同期処理がありました。
そろそろ!
APIコールとかもしちゃったらそろそろ本格的なBOTです。
でも、再起動したらデータって消えちゃいますよね。
何かデータを保存したいとき、どうすればいいのでしょうか。
ってなわけで、次回はデータの保存について解説します。
さらば!