回答編集履歴
1
サンプルコードの追加
answer
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
time.sleep(10)
|
18
18
|
th2.stop()
|
19
19
|
time.sleep(100) # 追記 / stopで孫threadが止まるはずなのに、実行続く
|
20
|
-
コード
|
21
20
|
```
|
22
21
|
|
23
22
|
元々のコードでは、main終了時に、デーモンスレッドだけになる=孫threadが停止し、プログラム全体が終了というフローになっていたと考えます。[公式Document](http://docs.python.jp/3/library/threading.html#thread-objects)
|
@@ -25,4 +24,26 @@
|
|
25
24
|
|
26
25
|
Django上で実行したものはstop()が機能していないのでthreadが止まらず、また、django本体のスレッドは停止していない(?)ので、特にデーモンもkillされず、ThreadTwo終了/ BotClass終了まで処理が進んでしまっていたと考えます。
|
27
26
|
|
28
|
-
対策としては、threadではなくmultiprocessingを使うと良いかもしれません。terminate()関数により強制停止が可能なようです。(あまり知識がないので、もっと良い方法があるかもしれませんが…)
|
27
|
+
対策としては、threadではなくmultiprocessingを使うと良いかもしれません。terminate()関数により強制停止が可能なようです。(あまり知識がないので、もっと良い方法があるかもしれませんが…)
|
28
|
+
|
29
|
+
##(追記)stop()の実装
|
30
|
+
やりたいこととぜんぜん違うかもしれませんが、以下でstop的な動作になりました。
|
31
|
+
threadをkillする手段が無い以上、worker(thread)内部に停止コード仕込むしかない、と考えます。
|
32
|
+
[Qiitaでもpythonのthread記事は荒れてました。](http://qiita.com/tag1216/items/2dcb112f8018eb19a999#_reference-2affe5b053d4748ec49b)
|
33
|
+
```python
|
34
|
+
class BotClass:
|
35
|
+
# (前略)
|
36
|
+
def _thread_three(self):
|
37
|
+
for i in range(5):
|
38
|
+
if not self.listening: # add
|
39
|
+
break # add
|
40
|
+
time.sleep(2)
|
41
|
+
print(threading.currentThread().getName() + ': ' + str(i))
|
42
|
+
|
43
|
+
def _thread_four(self):
|
44
|
+
for i in range(5):
|
45
|
+
if not self.listening: # add
|
46
|
+
break # add
|
47
|
+
time.sleep(3)
|
48
|
+
print(threading.currentThread().getName() + ': ' + str(i))
|
49
|
+
```
|