2016-08-29 2 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

Queue.Empty이 스레드를 시작하기 전에 큐를 기입 잡을 수 있도록 준비 할 수 있습니다. –

+0

스레드가 async_dns 내부에서 시작합니까? –

+0

주 스레드가 종료되면 모든 스레드가 종료되도록 쉽게 만들 수 있습니다. sys.exit이 실제로하는 질문에 [내 대답] (http://stackoverflow.com/questions/38804988/what-does-sys-exit-really-do-with-multiple-threads/38805873#38805873)을 참조하십시오. 당신의 경우에'sys.exit()'를 명시 적으로 호출 할 필요는 없으며, 스크립트의 마지막에있는'for' 루프 다음에 자동적으로 발생합니다. – martineau

답변

0

제거 및 대기열에서 항목을 반환합니다. 선택적 args 블록이 true이고 timeout이 None (기본값)이면 항목이 사용 가능할 때까지 필요한 경우 차단하십시오. timeout이 양수인 경우 대부분의 timeout 초를 차단하고 해당 시간 내에 사용 가능한 항목이없는 경우 Empty 예외를 발생시킵니다. 그렇지 않으면 (블록은 false) 즉시 사용할 수있는 항목을 반환하고 그렇지 않으면 Empty 예외를 발생시킵니다 (이 경우 시간 초과는 무시됩니다).

대기열을 확인하십시오.

queue의 문서를 참조하십시오. 당신이 빈 큐에 도달하면

0

귀하의 스레드가 dname = q.get()

에 갇혀있다, q.get() 도착하는 가치를 영원히 기다릴 것이다.

당신은 get_nowait()get을 대체하지만 큐가 비어있을 때 스레드 함수 반환을 execption

관련 문제