teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

説明の曖昧な点を補足

2020/05/12 06:09

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -59,7 +59,7 @@
59
59
 
60
60
  大雑把な説明です。実際のコーディングの際の注意点に焦点を当てました。
61
61
 
62
- - async は、awaitを用いる関数 の定義で使います。この関数を呼び出すと「コルーチン」を返します。
62
+ - async は、awaitを用いる関数 の定義で使います。async付きで定義された関数を呼び出すと「コルーチン」を返します。
63
63
 
64
64
  asyncを付けると関数自体が自動的に非同期になったりは **しません** (よくある誤解1)
65
65
  関数内のコードの実行自体は通常と同じように処理されます。

5

関数名間違えのコード修正。再帰呼び出しになっていた

2020/05/12 06:09

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -147,7 +147,7 @@
147
147
 
148
148
  def add_event_detect(self, callback=None):
149
149
  if callback:
150
- self.add_event_detect(callback)
150
+ self.add_event_callback(callback)
151
151
  # ここは実際にも、add_event_detectを呼び出す事で、新スレッドが立ち上がります。
152
152
  self.start() # Thread.start -> 別スレッドでrun()を実行
153
153
 

4

apigpio について補足

2020/05/12 02:47

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -47,6 +47,13 @@
47
47
  `yield` が何かわからない場合、
48
48
  前提知識として「ジェネレータ」辺り迄は理解しておいた方が良いと思います。
49
49
 
50
+ 全体像はこのような感じになります(概要のみ)
51
+ - apigpio GPIOを扱う非同期IO
52
+ - discord を扱う非同期IO (client.runの代わりにclient.startを利用)
53
+ - NOTE: 非同期同士の連携には asyncio.Queue が使えます。
54
+ - asyncio.gatherで2つの非同期処理をまとめる (後述のコードを参考にして下さい)
55
+ - asyncio.runで開始
56
+
50
57
  ----
51
58
  ## async/await について
52
59
 

3

後からサイト上で編集した部分、client.start の引数でエラーになっていたのを修正。

2020/05/12 02:25

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -156,7 +156,7 @@
156
156
  async def run_event(self, *args, **kw):
157
157
  await self._callback(*args, **kw)
158
158
 
159
- async def start(self):
159
+ async def start(self, *args):
160
160
  # 非同期で動作。
161
161
  # 通常のtime.sleep 等、プログラムの実行を阻害する(ブロッキング)操作は、
162
162
  # asyncioのループを止めてしまうのでNG。非同期での代替の手段を取ります。

2

コード微修正

2020/05/12 02:14

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -218,7 +218,7 @@
218
218
  @client.event
219
219
  async def on_discord_message(msg):
220
220
  await asyncio.sleep(1)
221
- print("DISC recv from discord <<<", msg)
221
+ print("recv from discord <<<", msg)
222
222
 
223
223
  ##
224
224
  # (4) キュー内のメッセージを非同期で読み出し

1

discord の BOT token について追記

2020/05/12 02:08

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -238,9 +238,11 @@
238
238
  # - listen_queue_loop
239
239
  #
240
240
  # 非同期処理: ディスコードclient と、キューの読み出しの開始
241
- await asyncio.gather(client.start(), listen_queue_loop())
242
241
 
242
+ BOT_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
243
+ await asyncio.gather(client.start(BOT_TOKEN), listen_queue_loop())
243
244
 
245
+
244
246
  if __name__ == '__main__':
245
247
  try:
246
248
  asyncio.run(main())