2016-08-18 10 views
0

私はスレッドがネットワーク上でREST呼び出しを行うスレッドアプリケーションを開発しようとしています。ブロッキングスレッドを強制終了する

特定のタイムアウト後にアクティブなスレッドを強制終了する必要があります。私はここで見てきたすべてのpython 2.7.xのアプローチを試してきましたが、これを得ることはできません。

OEL linux(3.8.13-44.1.1.el6uek.x86_64)でpython 2.7.6を使用しています。ここで

は、コードの簡略化スニペットです:

class cthread(threading.Thread): 
    def __init__(self, cfg, host): 
     self.cfg = cfg 
     self.host = host 
     self.runf = False 
     self.stop = threading.Event() 
     threading.Thread.__init__(self. target=self.collect) 

    def terminate(self): 
     self.stop.set() 

    def collect(self): 
     try: 
      self.runf = True 
      while (not self.stop.wait(1)): 
       # Here I do urllib2 GET request to a REST service which could hang 
       <rest call> 
     finally: 
      self.runf = False 

timer_t1 = 0 

newthr = cthread(cfg, host) 
newthr.start() 

while True: 
    if timer_t1 > 600: 
     newthr.terminate() 
     break 
    time.sleep(30) 
    timer_t1 += 30 

基本的に私のタイムアウト時間の後、私はどちらか正常かどうか、残りのすべてのスレッドを殺すために必要があります。

これを動作させるには時間がありません。

私は正しい方法を考えていますか?

+0

http://stackoverflow.com/questions/13821156/timeout-function-using-threading-in-python-does-not-work – Frodon

答えて

0

Pythonでスレッドを強制終了する公式のAPIはありません。あなたが定期的にメインループから実行してタイムアウトオプションでurllib2のを使用するようにスレッド放置タイムアウトを渡すかもしれないurllib2のに頼って自分のコードで

。あるいは、urllib2で同じ手法を利用してスレッド内のタイマーを追跡することさえできます。

+0

スレッドの代わりにサブプロセスを使用する必要がありました。これをPythonスレッドで確実に行う方法はありません。少なくとも2.7.xのPythonではそうではありません。 Perlでさえ、Python 2.7よりスレッドで優れています。もちろん、私はサブプロセスを使用しているので、メモリのフットプリントについて心配する必要があります...この時点で長期計画はこれをJavaに移行することです。 – BenH

関連する問題