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

回答編集履歴

1

サンプルコードの追加

2017/01/05 01:46

投稿

uni8inu
uni8inu

スコア127

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
+ ```