Ctrl-C를 사용하여 Python 스크립트를 죽일 수 없음
다음 스크립트를 사용하여 파이썬 스레드화를 테스트하고 있습니다.
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
이것은 쿠분투 11.10의 파이썬 2.7에서 실행되고 있습니다.C +는 그것을 죽이지 않을 것입니다.또한 시스템 신호에 대한 핸들러를 추가하려고 했지만 도움이 되지 않았습니다.
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
프로세스를 종료하기 위해 Z+로 프로그램을 백그라운드로 보낸 후 PID로 종료합니다. 무시되지 않습니다.+가 왜 그렇게 지속적으로 무시되고 C있습니까?어떻게 해결할 수 있습니까?
메인 스레드를 Ctrl종료하지만C 스레드가 데몬 모드가 아니기 때문에 계속 실행되므로 프로세스가 활성화됩니다.우리는 그들을 데몬으로 만들 수 있습니다.
f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()
그러나 또 다른 문제가 있습니다. 일단 메인 스레드가 스레드를 시작하면 다른 방법이 없습니다.그래서 그것은 빠져나가고, 실은 즉시 파괴됩니다.그럼 메인 스레드를 유지해 보겠습니다.
import time
while True:
time.sleep(1)
이제 C+를 누를 때까지 '첫 번째'와 '두 번째' 인쇄가 유지됩니다.
편집: 논평가들이 지적했듯이, 데몬 스레드는 임시 파일과 같은 것들을 정리할 기회를 얻지 못할 수도 있습니다.그게 필요하다면, 그것을 잡아라.KeyboardInterrupt
메인 스레드에서 정리 및 종료를 조정합니다.하지만 많은 경우, 데몬 스레드가 갑자기 죽는 것으로 충분할 것입니다.
키보드인터럽트 및 신호는 프로세스(즉, 메인 스레드)에서만 볼 수 있습니다.Ctrl-c.e.를 확인합니다. 키보드파이썬에서 스레드를 죽이기 위한 인터럽트
전화하는 것이 가장 좋을 것 같습니다.join()
당신이 그들이 죽기를 기대할 때 당신의 실 위에.루프를 끝까지 변경할 수 있습니다(필요한 정리 작업도 여기에 추가할 수 있습니다)변수die
각 패스와 시간에 대해 확인됩니다.True
프로그램이 종료됩니다.
import threading
import time
class MyThread (threading.Thread):
die = False
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run (self):
while not self.die:
time.sleep(1)
print (self.name)
def join(self):
self.die = True
super().join()
if __name__ == '__main__':
f = MyThread('first')
f.start()
s = MyThread('second')
s.start()
try:
while True:
time.sleep(2)
except KeyboardInterrupt:
f.join()
s.join()
@Thomas K의 답변의 개선된 버전:
코드 예제:
import threading
def job1():
...
def job2():
...
def is_any_thread_alive(threads):
return True in [t.is_alive() for t in threads]
if __name__ == "__main__":
...
t1 = threading.Thread(target=job1,daemon=True)
t2 = threading.Thread(target=job2,daemon=True)
t1.start()
t2.start()
while is_any_thread_alive([t1,t2]):
time.sleep(0)
조심해야 할 간단한 '고차' 하나, 정말 안 켜져 있나요?
저는 Pi4에서 Thonny IDE에서 Python 스크립트를 실행하고 있었습니다.켜지면 ++ShiftC가 +C가 아닌 키보드 버퍼로 전달됩니다.
언급URL : https://stackoverflow.com/questions/11815947/cannot-kill-python-script-with-ctrl-c
'programing' 카테고리의 다른 글
Spring Boot: ApplicationListener 로깅이 Application Server 로깅을 방해합니다. (0) | 2023.07.22 |
---|---|
SqlAlchemy 및 cx_Oracle을 사용하여 Pandas DataFrame을 Oracle 데이터베이스에 작성할 때 _sql()까지 속도 향상 (0) | 2023.07.22 |
파이썬을 사용하는 모든 ASCII 문자 목록을 가져오려면 어떻게 해야 합니까? (0) | 2023.07.22 |
TestRestTemplate 사용 시 예외 발생 (0) | 2023.07.22 |
Hibernate가 org.hibernate를 던지는 이유는 무엇입니까?예외.잠금 획득예외? (0) | 2023.07.22 |