LoginSignup
2
2

More than 1 year has passed since last update.

【23日目】コードは非同期処理で。【PythonでDiscordBOTを作ろう!】

Last updated at Posted at 2022-12-22

例えば...

コマンドにいろんな機能をつけていくと、例えば外部の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とかがあればきっとそこら辺が非同期処理かもしれません。
実際、よく使っているライブラリのa2smcstatusの中にも非同期処理がありました。

そろそろ!

APIコールとかもしちゃったらそろそろ本格的なBOTです。
でも、再起動したらデータって消えちゃいますよね。
何かデータを保存したいとき、どうすればいいのでしょうか。

ってなわけで、次回はデータの保存について解説します。
さらば!

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2