回答編集履歴
6
説明の曖昧な点を補足
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
関数名間違えのコード修正。再帰呼び出しになっていた
answer
CHANGED
@@ -147,7 +147,7 @@
|
|
147
147
|
|
148
148
|
def add_event_detect(self, callback=None):
|
149
149
|
if callback:
|
150
|
-
self.
|
150
|
+
self.add_event_callback(callback)
|
151
151
|
# ここは実際にも、add_event_detectを呼び出す事で、新スレッドが立ち上がります。
|
152
152
|
self.start() # Thread.start -> 別スレッドでrun()を実行
|
153
153
|
|
4
apigpio について補足
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 の引数でエラーになっていたのを修正。
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
コード微修正
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("
|
221
|
+
print("recv from discord <<<", msg)
|
222
222
|
|
223
223
|
##
|
224
224
|
# (4) キュー内のメッセージを非同期で読み出し
|
1
discord の BOT token について追記
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())
|