파이썬에서 스레드 내부에서 호출할 때 sys.exit()이 종료되지 않는 이유는 무엇입니까?
다음 코드 스니펫이 스레드에서 호출될 때 종료되지 않고 메인 스레드에서 호출될 때 종료되는 이유가 무엇인지 혼란스럽습니다.
import sys, time
from threading import Thread
def testexit():
time.sleep(5)
sys.exit()
print "post thread exit"
t = Thread(target = testexit)
t.start()
t.join()
print "pre main exit, post thread exit"
sys.exit()
print "post main exit"
의 문서sys.exit()
호출이 Python에서 종료되어야 함을 나타냅니다.이 프로그램의 출력을 보면 "post thread exit"은 인쇄되지 않지만 스레드가 exit을 호출한 후에도 메인 스레드는 계속 진행된다는 것을 알 수 있습니다.
각 스레드에 대해 생성되는 인터프리터의 개별 인스턴스이며, 다음에 대한 호출입니다.exit()
다른 인스턴스를 종료하는 것뿐입니까?그렇다면 스레딩 구현은 공유 리소스에 대한 액세스를 어떻게 관리합니까?스레드에서 프로그램을 종료하려면 어떻게 해야 합니까(내가 실제로 원하는 것이 아니라 이해하기 위해)?
sys.exit()
를 높입니다.SystemExit
예외적으로, 마찬가지로thread.exit()
그래서, 언제sys.exit()
해당 스레드 내에서 예외를 발생시킵니다. 호출과 동일한 효과가 있습니다.thread.exit()
그렇기 때문에 스레드만 빠져나갑니다.
스레드에서 프로그램을 종료하려면 어떻게 해야 합니까?
Linux의 경우:
os.kill(os.getpid(), signal.SIGINT)
이 메시지는 다음과 같습니다.SIGINT
a를 높이는 주요 스레드로KeyboardInterrupt
그것으로 당신은 적절한 청소를 할 수 있습니다.또한 다르게 대응하려면 핸들러를 등록할 수 있습니다.
Windows의 경우:
위의 내용은 Windows에서만 작동하지 않습니다.SIGTERM
Python에서 처리되지 않고 와 동일한 효과를 갖는 signalos._exit()
.
유일한 옵션은 다음을 사용하는 것입니다.
os._exit()
정리하지 않고 전체 프로세스가 종료됩니다.정리가 필요한 경우 다른 방법으로 기본 스레드와 통신해야 합니다.
스레드에서 프로그램을 종료하려면 어떻게 해야 합니까?
디스탄이 설명한 방법을 제외하고는 당신이 전화할 수 있습니다.os._exit
(밑줄에 밑줄 표시합니다.사용하기 전에 정리(예: 호출)를 수행하지 않음을 이해해야 합니다.__del__
또는 유사).
스레드에서 프로그램을 종료하려면 어떻게 해야 합니까(내가 실제로 원하는 것이 아니라 이해하기 위해)?
제가 선호하는 방법은 얼랭식 메시지 전달입니다.약간 단순화하면 다음과 같습니다.
import sys, time
import threading
import Queue # thread-safe
class CleanExit:
pass
ipq = Queue.Queue()
def testexit(ipq):
time.sleep(5)
ipq.put(CleanExit)
return
threading.Thread(target=testexit, args=(ipq,)).start()
while True:
print "Working..."
time.sleep(1)
try:
if ipq.get_nowait() == CleanExit:
sys.exit()
except Queue.Empty:
pass
"본 출구, 후 스레드 출구"가 인쇄되어 있다는 사실이 당신을 괴롭히는 것입니까?
다른 언어(자바와 같은)와 달리 아날로그는sys.exit
(System.exit
Java의 경우)에서 VM/프로세스/인터프리터를 즉시 중지합니다. Python의sys.exit
예외를 발생시킵니다. 특히 SystemExit 예외가 발생합니다.
다음 문서는 다음과 같습니다.sys.exit
)print sys.exit.__doc__
):
SystemExit(상태)을 올려 인터프리터를 종료합니다.
상태가 생략되거나 없음인 경우 기본값은 0(즉, 성공)입니다.
상태가 숫자인 경우 시스템 종료 상태로 사용됩니다.
그것이 물건이라면, 은 인쇄될 것입니다.
종료 상태는 1(즉, 실패)입니다.
이는 다음과 같은 몇 가지 결과를 가져옵니다.
- 스레드에서 프로세스 전체가 아닌 현재 스레드만 죽입니다(스택의 맨 위까지 이동하는 경우...).
- 파괴자객체소기멸(▁(기▁object객
__del__
)는 해당 으로 잠재적으로 됩니다.)는 상태입니다. - 마지막으로 스택이 풀리면서 블록이 실행됩니다.
- 당신은 잡을 수 있습니다.
SystemExit
마지막은 아마도 가장 놀라운 것일 것이며, 당신이 자격이 없는 사람을 거의 갖지 말아야 하는 또 다른 이유입니다.except
구문을 입력합니다.
_thread.interrupt_main()
Python 3.7 이후부터 사용 가능(이전의 옵션)
언급URL : https://stackoverflow.com/questions/905189/why-does-sys-exit-not-exit-when-called-inside-a-thread-in-python
'source' 카테고리의 다른 글
Oracle TO_DATE NOT throw 오류 (0) | 2023.08.02 |
---|---|
Mac OS X에서 Android SDK를 설치하는 위치는 무엇입니까? (0) | 2023.08.02 |
Global.asax를 디버깅할 수 있습니까? (0) | 2023.08.02 |
텍스트 편집 필드가 비어 있는지 확인하려면 어떻게 합니까? (0) | 2023.08.02 |
목표 C(iOS)에서 이미지에 텍스트를 쓰는 방법은 무엇입니까? (0) | 2023.08.02 |