私は定期的に外部ネットワークリソースに接続する長時間実行しているプログラムを持っています。私は、タイムアウトスレッドでこれらの呼び出しをラップしてきたため、コールが10秒以上かかる場合、呼び出しはすぐにエラーを返し、そうのように:スレッドのマニュアルを読むハングするスレッドを最終的にPythonでガベージコレクションする方法
def fetch_resource(url):
class TimeoutThread(Thread):
def __init__(self):
Thread.__init__(self)
self.result = None
def run(self):
self.result = requests.get(url)
tt = TimeoutThread()
tt.start()
tt.join(10.0)
if tt.result:
return tt.result.content
else:
return None
、しかし、Thread.join()
が返されます表示されます次のいずれか
- スレッドが終了、または10セコで
.join()
戻る場合 10秒で
nds、スレッドはまだ生きている、正しい?スレッドを強制終了する良い方法はないと理解していますが、最終的にスレッドが終了してガーベッジ・コレクションが確実に行われるようにするにはどうすればよいですか?私はスレッドがハングアップして戻ってこないことを心配しており、決して解放されないリソースを次第に摂取しています。
スレッドが長時間実行されている場合、おそらくループ内で実行されている可能性がありますか?そのループ内のチェックを追加します。たとえば、self .__ quitがTrueに設定されている場合、ループを終了します。スレッドの結合メソッドを上書きしてself .__ quitをTrueに設定し、ループとスレッドの実行を終了することができます。 –
潜在的に長いスレッドは 'self.result = requests.get(url)'です。そうではありません、それはループではありません。 –
次に、finally.get(url)の内部ロジックに依存すると思います。それは何ですか? – jdi