2016-09-08 4 views
2

:어떻게 모든 스레드를 죽일 수 있습니까? 이 스크립트에서

import threading, socket  

class send(threading.Thread): 

    def run(self): 
     try: 
      while True: 
       try: 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        s.connect((url,port)) 
        s.send(b"Hello world!") 
        print ("Request Sent!") 
       except: 
        s.close() 
     except KeyboardInterrupt: 
      # here i'd like to kill all threads if possible 

for x in range(800): 
    send().start() 

그것은 KeyboardInterrupt의 제외하고 모든 스레드를 죽일 수 있습니까? 나는 그물을 검색했고 그래, 이미 물었다는 것을 알고 있지만, 나는 파이썬으로는 정말 새롭다. 그리고 나는이 다른 질문에 대한 방법이 너무 복잡해지지 않았다.

+0

당신은 모든 스레드를 죽이고 싶습니다 ... 이것은 주 스레드를 포함하고 결과적으로 응용 프로그램입니까? 그렇다면 간단히 모든 스레드 [daemons] (https://docs.python.org/3.4/library/threading.html#threading.Thread.daemon)를 만들고 나서 종료하고 싶다면'sys.exit ()'. – CristiFati

+0

@CristiFati :'KeyboardInterrupt'가 스레드 중 하나 (기본적으로 무작위 IIRC 인 스레드)에 전달되면 도움이되지 않습니다. 따라서 적절한 시간에 '종료'할 수 있도록 주 스레드에 경고 할 필요가 있습니다. – ShadowRanger

+0

오른쪽 @ShadowRanger, 그것을 지적 해 주셔서 감사합니다, 스레드는 예외를 삼키는 경향이 있습니다. 참고로 스레드를 처리 할 때 역방향 접근 방식을 사용합니다. 스레드의 루프에서 키를 누른 경우 (논리를 키를 기준으로 확장 할 수 있음) 끝내십시오. – CristiFati

답변

1

아니요. 개별 스레드를 강제 종료 할 수 없습니다 (잠금 상태를 유지하여 교착 상태가 발생할 수 있으므로 안전하지 않습니다). 이런 일을 할 수

두 가지 방법이하는 것 중 하나

  1. 는 모든 스레드는 메인 스레드가 Event/Condition에서 대기하고 즉시 스레드 세트의 하나로서 종료와 함께, daemon 스레드로 시작했습니다 Event 또는 Condition을 알립니다. daemon 스레드가 종료 되 자마자 프로세스가 종료되고 모든 daemon 스레드가 종료됩니다.
  2. 공유 된 Event을 사용하여 모든 스레드가 간헐적으로 폴링하므로 설정 한 후 즉시 종료됩니다.
+0

답해 주셔서 감사합니다. 나는 여기에 2 가지 방법을 봤어 : http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python하지만 난 정말 어떻게 구현 해야할지 모르겠다. 내 send() 클래스에. – Sperly1987

+0

_Win_ 또는 _Ux_에서 코드를 실행하고 있습니까? – CristiFati

+0

리눅스에서 실행 중입니다. – Sperly1987