source

파이썬에서 스레드 내부에서 호출할 때 sys.exit()이 종료되지 않는 이유는 무엇입니까?

nicesource 2023. 8. 2. 09:14
반응형

파이썬에서 스레드 내부에서 호출할 때 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)

이 메시지는 다음과 같습니다.SIGINTa를 높이는 주요 스레드로KeyboardInterrupt그것으로 당신은 적절한 청소를 할 수 있습니다.또한 다르게 대응하려면 핸들러를 등록할 수 있습니다.

Windows의 경우:

위의 내용은 Windows에서만 작동하지 않습니다.SIGTERMPython에서 처리되지 않고 와 동일한 효과를 갖는 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.exitJava의 경우)에서 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

반응형