2012-02-02 10 views
0

私は定期的に外部ネットワークリソースに接続する長時間実行しているプログラムを持っています。私は、タイムアウトスレッドでこれらの呼び出しをラップしてきたため、コールが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()が返されます表示されます次のいずれか

  1. スレッドが終了、または10セコで.join()戻る場合
  2. 10秒で

nds、スレッドはまだ生きている、正しい?スレッドを強制終了する良い方法はないと理解していますが、最終的にスレッドが終了してガーベッジ・コレクションが確実に行われるようにするにはどうすればよいですか?私はスレッドがハングアップして戻ってこないことを心配しており、決して解放されないリソースを次第に摂取しています。

+0

スレッドが長時間実行されている場合、おそらくループ内で実行されている可能性がありますか?そのループ内のチェックを追加します。たとえば、self .__ quitがTrueに設定されている場合、ループを終了します。スレッドの結合メソッドを上書きしてself .__ quitをTrueに設定し、ループとスレッドの実行を終了することができます。 –

+0

潜在的に長いスレッドは 'self.result = requests.get(url)'です。そうではありません、それはループではありません。 –

+0

次に、finally.get(url)の内部ロジックに依存すると思います。それは何ですか? – jdi

答えて

2

なぜ、別のスレッドで迷惑をかけるのか分かりません。要求が完了するのを待っている間にメインスレッドがブロックされていたり、タイムアウトしていることが考えられます。単にタイムアウトを要求しないのはなぜですか?

Socket.setdefaulttimeoutを呼び出して、そのポイントから作成されたSocketオブジェクトにデフォルトのタイムアウトを適用することができます。ライブラリ自体では、要求のタイムアウトを指定するオプションはありません。