Python 스레드에서 전체 애플리케이션을 종료하는 방법은 무엇입니까?
스레드 중 하나에서 전체 Python 애플리케이션을 종료하려면 어떻게해야합니까? sys.exit ()는 호출 된 스레드 만 종료하므로 도움이되지 않습니다.
이것은 매우 깨끗하지 않기 때문에 os.kill () 솔루션을 사용하고 싶지 않습니다.
기본 스레드를 제외한 모든 스레드가 데몬 인 경우 가장 좋은 방법은 일반적으로 thread.interrupt_main ()입니다 . 모든 스레드가이를 사용 KeyboardInterrupt
하여 기본 스레드에서 a를 발생시킬 수 있습니다. 주 스레드의 종료자가 호출되는 등).
물론 이로 인해 전체 프로세스를 유지하는 데몬이 아닌 스레드가 발생 os._exit
하면 Mark가 권장 하는 대로 후속 조치를 취해야합니다. 하지만 kill -9
이것이 일을 종료하기 때문에 마지막 수단으로 간주합니다 ( ;- 처럼) 상당히 무자비합니다 ( try/finally
블록, with
블록, atexit
함수 등을 포함하여 실행되지 않는 파이널 라이저 ).
짧은 대답 : os._exit
.
예를 들어 긴 대답 :
DevShed의 튜토리얼 에서 간단한 스레딩 예제를 잡아 당기고 약간 수정했습니다 .
import threading, sys, os
theVar = 1
class MyThread ( threading.Thread ):
def run ( self ):
global theVar
print 'This is thread ' + str ( theVar ) + ' speaking.'
print 'Hello and good bye.'
theVar = theVar + 1
if theVar == 4:
#sys.exit(1)
os._exit(1)
print '(done)'
for x in xrange ( 7 ):
MyThread().start()
sys.exit(1)
주석 처리 를 계속 하면 세 번째 스레드가 인쇄 된 후 스크립트가 종료됩니다. 을 사용 sys.exit(1)
하고 주석 처리 os._exit(1)
하면 세 번째 스레드가 인쇄 되지 않고(done)
프로그램이 7 개의 스레드를 모두 실행합니다.
os._exit
"일반적으로 fork () 후 자식 프로세스에서만 사용해야합니다."-별도의 스레드가 사용자의 목적에 충분히 가깝습니다. 또한 os._exit
해당 매뉴얼 페이지 바로 뒤에 열거 된 값이 여러 개 os._exit
있으며 위의 예에서 사용한 것과 같은 단순한 숫자 대신 인수로 선호해야합니다 .
thread.interrupt_main()
어떤 상황에서는 사용 이 도움이되지 않을 수 있습니다. KeyboardInterrupt
s는 명령 줄 응용 프로그램에서 현재 명령을 종료하거나 입력 줄을 정리하는 데 자주 사용됩니다.
또한 코드에서 블록을 os._exit
실행하지 않고 즉시 프로세스를 종료 finally
하므로 위험 할 수 있습니다 (예 : 파일 및 연결이 닫히지 않음).
내가 찾은 해결책은 사용자 지정 예외를 발생시키는 기본 스레드에 신호 처리기를 등록하는 것입니다. 백그라운드 스레드를 사용하여 신호를 발생시킵니다.
import signal
import os
import threading
import time
class ExitCommand(Exception):
pass
def signal_handler(signal, frame):
raise ExitCommand()
def thread_job():
time.sleep(5)
os.kill(os.getpid(), signal.SIGUSR1)
signal.signal(signal.SIGUSR1, signal_handler)
threading.Thread(target=thread_job).start() # thread will fire in 5 seconds
try:
while True:
user_input = raw_input('Blocked by raw_input loop ')
# do something with 'user_input'
except ExitCommand:
pass
finally:
print('finally will still run')
관련 질문 :
- Python의 스레드 내에서 호출 될 때 sys.exit ()가 종료되지 않는 이유는 무엇입니까?
- Python : raw_input을 차단할 때 CLI를 종료하는 방법은 무엇입니까?
참조 URL : https://stackoverflow.com/questions/1489669/how-to-exit-the-entire-application-from-a-python-thread
'Program Tip' 카테고리의 다른 글
다른 유형에 대한 포인터의 크기가 다른 플랫폼이 있습니까? (0) | 2020.12.15 |
---|---|
SQLServer가 불필요한 항목을 작성하는 것을 중지하는 방법 (예 : 영향을받는 행 1 개) (0) | 2020.12.15 |
사용자 지정 AuthorizeAttribute 클래스 내에서 RedirectToAction ()을 사용할 수 있습니까? (0) | 2020.12.15 |
객체 배열에서 잘못된 자바 스크립트 배열 길이 (0) | 2020.12.15 |
Java에서 MySQL 날짜 및 타임 스탬프 처리 (0) | 2020.12.15 |