実現したいこと
何度実行してもrole.editが動作するようになる.
発生している問題・分からないこと
1度目のclient.runではchange_role_colorが継続して動作する(少なくとも2時間以上動作することを確認)ものの,
2度目以降のclient.runではawait role.editを数回~20回弱処理した後に動作が停止してしまいます.
これは1度目の総実行時間に関係なく発生します.
エラーメッセージ
error
1ごくまれにリクエストが多すぎるから〇〇秒後にやり直せ(60秒未満)という警告が1度発されます.
該当のソースコード
python
1from collections import deque 2 3import discord 4from discord.ext import tasks 5 6from discord_token import TOKEN 7 8RGB_deque = deque([16739953, 16739776, 16739327, 9 16748543, 14389759, 9354751, 10 9371647, 9371540, 16768660]) 11 12# 受信イベント設定 13intents = discord.Intents.all() 14client = discord.Client(intents=intents) 15 16 17@client.event 18async def on_ready(): 19 guild_id = idの数値 20 guild = client.get_guild(guild_id) 21 22 role_id = idの数値 23 role = guild.get_role(role_id) 24 change_role_color.start(role) 25 26 27@tasks.loop(seconds=8) 28async def change_role_color(role): 29 new_color = RGB_deque.popleft() 30 print(f'change {new_color}') 31 await role.edit(color=new_color) 32 print(f'changed {new_color}') 33 RGB_deque.append(new_color) 34 35 36if __name__ == '__main__': 37 try: 38 client.run(TOKEN) 39 except KeyboardInterrupt: 40 client.close() 41
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
検索の結果,os.system("kill 1")をすればよいという情報は得られましたが,wnidowsでは好ましくないように感じますしエラーとなりました.
自身のコードの変更ではget_guildやget_roleをon_ready内に記述することで起動時に1度だけ実行するようにしてアクセス回数を削減してみました.
また,ctrl+cを補足してcloseするように変更しました.
補足
切断方法を頂いた検索ワードで再度調べた結果,以下の切断方法が見つかりましたが,どちらも公式リファレンスには存在しておりませんでした.
python
1await client.logout() 2await client.Logoff()
また,私は提示したソースコードの40行目においてdiscordを切断しているのですが,これは本来awaitを入れなければならないものでした.
しかし,discord bot が想定通り停止しているため今回の問題とは関係ないと思われます.
また,停止後の動作はbotがオフラインとなりプログラムが停止いたします.
何ら一切の処理はそのあと行われません.
動作が継続されているのではそいうご指摘をいただきましたが,念のためwindowsを再起動しても同様の症状であったため,その可能性は低いと考えます.
windowsを再起動して再度コマンドラインから実行しても数回~20回弱で色の更新が止まってしまいます.
1度目のclient.runと2度目以降のclient.runは同一のcmdウィンドウから実行しております.
なお,1日程度日を開けると再度連続して動作するように(期待したように)なるようです.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。