2016-08-29 22 views
0

以下のスクリプトを使用すると、スレッドを終了できないようです。スクリプトは問題なく円滑に実行されますが、終了しても終了しません。私はまだスレッドが生きているのを見ることができます、私はhtopを使ってそれらを殺すか、コマンドラインを完全に終了させなければなりません。スレッドが終了せず、プ​​ログラムが終了しない

このスクリプトを終了してスレッドを終了させる方法を教えてください。

def async_dns(): 
    s = adns.init() 
    while True: 
     dname = q.get() 
     response = s.synchronous(dname,adns.rr.NS)[0] 
     if response == 0: 
      dot_net.append("Y") 
      print(dname + ", is Y") 
     elif response == 300 or response == 30 or response == 60: 
      dot_net.append("N") 
      print(dname + ", is N") 
     elif q.empty() == True: 
      q.task_done() 

q = queue.Queue() 
threads = [] 
for i in range(20): 
    t = threading.Thread(target=async_dns) 
    threads.append(t) 
    t.start() 

for name in names: 
    q.put_nowait(name) 
+0

をキャッチする準備ができて取得することができます。 –

+0

スレッドはasync_dns内で開始しますか? –

+0

メインスレッドが終了すると、すべてのスレッドが終了するように簡単に作成できます。質問に_ [私の答え](http://stackoverflow.com/questions/38804988/what-does-sys-exit-really-do-with-multiple-threads/38805873#38805873)を参照してください_ sys.exitが実際に行うことあなたの場合、 'sys.exit()'を明示的に呼び出す必要はありませんが、スクリプトの最後の最後の 'for'ループの後に自動的に発生します。 – martineau

答えて

0

キューから項目を削除し、返します。オプションのargsブロックがtrueでタイムアウトがNone(デフォルト)の場合、必要に応じて項目が使用可能になるまでブロックします。 timeoutが正数の場合、タイムアウト秒間にブロックされ、その時間内に利用可能な項目がない場合はEmpty例外が発生します。それ以外の場合(ブロックは偽)、すぐに使用できるアイテムがあればそれを返し、そうでない場合はEmpty例外を発生させます(この場合はタイムアウトは無視されます)。

キューを確認してください。

queueの文書を参照してください。

0

あなたのスレッドは、あなたが空のキューに到達した場合は値が到着するのを、q.get()は永遠に待ちますdname = q.get()

で立ち往生しています。

あなたはget_nowait()getを置き換えるが、スレッドを開始する前にキューを記入し、キューが空になるとスレッド関数の戻り値を聞かせてQueue.Empty execption

関連する問題