回答編集履歴
3
追記2 ライブラリ側でのタイムアウト対応について
answer
CHANGED
@@ -72,6 +72,18 @@
|
|
72
72
|
但し、ライブラリ等の関数内で時間が掛かる処理がある場合は、
|
73
73
|
前者の方法では対応できません。
|
74
74
|
|
75
|
+
|
76
|
+
追記2:
|
77
|
+
質問のコードには書かれてませんが、
|
78
|
+
スクレイプという事なので、requests 等のライブラリをお使いでしょうか?
|
79
|
+
もし、ライブラリ側で対応しているなら、そちらの timeout オプションの利用が適してます。
|
80
|
+
|
81
|
+
thread.join(timeout=3) は、スケジュールのループを3秒間ブロックするので、
|
82
|
+
秒単位のスケジュールがある場合、3秒遅延になります。
|
83
|
+
|
84
|
+
ライブラリ側でのタイムアウトであれば、(質問のコードの構成の場合)別スレッドなので、
|
85
|
+
メインスレッドのスケジュールのループに影響ありません。
|
86
|
+
|
75
87
|
----
|
76
88
|
concurrency モジュールに言及しておくと、
|
77
89
|
concurrency.future には cancel() がありますが、
|
2
デーモン化したスレッドについて補足
answer
CHANGED
@@ -81,4 +81,16 @@
|
|
81
81
|
別の選択肢としては、非同期IOの導入
|
82
82
|
asyncio.Task の cancel() は、
|
83
83
|
実行中の処理の中断という用途には近いかもしれません。
|
84
|
-
asyncio対応ライブラリであれば、I/O処理待ちのタイミングでの中断が可能です。
|
84
|
+
asyncio対応ライブラリであれば、I/O処理待ちのタイミングでの中断が可能です。
|
85
|
+
|
86
|
+
----
|
87
|
+
追記
|
88
|
+
|
89
|
+
> scheduleを使用するとデーモン化しても裏でまだスレッドが普通に生きてます。
|
90
|
+
|
91
|
+
ここも恐らく誤解だと思います、
|
92
|
+
どのようにスレッドの生存を確認したのでしょうか。
|
93
|
+
|
94
|
+
schedule の利用の有無に関わらず、デーモンスレッドが破棄されるのは、
|
95
|
+
「デーモンでない生存中のスレッドが全てなくなる」タイミングなので、
|
96
|
+
メインスレッドが終了した後です。
|
1
文章の修正
answer
CHANGED
@@ -56,10 +56,12 @@
|
|
56
56
|
リソースの解放を考慮した「きちんとしたスレッドの停止」を行いたいのでしょうか。
|
57
57
|
|
58
58
|
|
59
|
-
回答としては、まずはスレッド
|
59
|
+
回答としては、まずはスレッドで行う処理中に、
|
60
60
|
解放が必要なリソースがあるかどうか確認したうえで、
|
61
|
-
スレッド内で行う処理は、安全に中断可能な設計にする必要があります。
|
62
61
|
|
62
|
+
スレッド内で行う処理は、後処理が確実に実行されるように、
|
63
|
+
安全に中断可能な設計にする必要があります。
|
64
|
+
|
63
65
|
join(timeout) の後に、is_alive() を確認して、
|
64
66
|
生存(タイムアウト)だった場合は、
|
65
67
|
スレッドの処理を完了させるための通知を行います。
|