回答編集履歴
2
スレッドの扱いについて追記
answer
CHANGED
@@ -34,4 +34,17 @@
|
|
34
34
|
|
35
35
|
concurrent.futures モジュールを使うと、
|
36
36
|
スレッドで処理を行った後、任意の関数を実行できます。
|
37
|
-
但し、スレッド部分のコードの大幅な変更が必要になるので、参考適度に。
|
37
|
+
但し、スレッド部分のコードの大幅な変更が必要になるので、参考適度に。
|
38
|
+
|
39
|
+
----
|
40
|
+
追記: スレッド内ではグローバル変数は極力使わない方が良いです。
|
41
|
+
スレッドセーフな操作を保証できません。
|
42
|
+
|
43
|
+
現状で問題が無ければ無理に修正しなくても良いかもしれませんが、
|
44
|
+
もし終了時にエラーが出るようなことがあれば、以下を検討して見て下さい。
|
45
|
+
|
46
|
+
- データベースの初期化や後始末はスレッド内(関数loopの頭と末尾)で行う
|
47
|
+
- 双方からアクセスするキューはThread のargs引数としてスレッドで実行する関数に渡す。
|
48
|
+
キューはスレッドセーフなので、双方のスレッドで扱っても問題ない。
|
49
|
+
- キューの読み出しループは、特定のメッセージを受けるとループを中断出来るようにする。
|
50
|
+
(loopflag ではなく内側のループ。読み出すメッセージが無いと get で待機したまま止まってます)
|
1
修正
answer
CHANGED
@@ -28,9 +28,7 @@
|
|
28
28
|
引数の数が変わってくると思うので、メッセージを処理別に
|
29
29
|
namedtuple や dataclasses を使いクラスを定義すると良いです。
|
30
30
|
|
31
|
-
もう少し柔軟にしたい場合は、getattr を使い任意のメソッドを呼び出す
|
32
31
|
|
33
|
-
|
34
32
|
----
|
35
33
|
別アプローチでの解決策
|
36
34
|
|