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

回答編集履歴

3

追記2 ライブラリ側でのタイムアウト対応について

2021/05/17 02:05

投稿

teamikl
teamikl

スコア8817

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

デーモン化したスレッドについて補足

2021/05/17 02:04

投稿

teamikl
teamikl

スコア8817

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

文章の修正

2021/05/16 10:04

投稿

teamikl
teamikl

スコア8817

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
  スレッドの処理を完了させるための通知を行います。