2016-08-29 5 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, а timeout - None (по умолчанию), блокируйте, если необходимо, до тех пор, пока элемент не будет доступен. Если тайм-аут - это положительное число, он блокирует не более времени ожидания и вызывает пустое исключение, если в течение этого времени не было доступно ни одного элемента. В противном случае (блок является ложным), возвратите элемент, если он сразу доступен, иначе добавьте пустое исключение (тогда в этом случае игнорируется время ожидания).

Не забывайте проверять свою очередь.

См. Документ queue.

0

Ваши темы застряли в dname = q.get()

Если Вы достигающий пустой очереди, q.get() будет ждать вечно значение, чтобы прибыть.

Вы можете заменить get с get_nowait(), но будьте готовы поймать Queue.Empty execption