728x90
파이썬에서 스레드를 사용하다가 스레드를 종료하는 방법을 정리하기로 하였다.
1. 메인 스레드가 종료될 때 서브 스레드 종료시키기
메인 스레드가 종료될 때 서브 스레드를 종료시키는 방법은 아주 간단하다.
데몬 스레드로 선언해주면 메인 스레드가 종료될 때 자신의 작업 완료 여부는 관계없이 해당 스레드는 종료가 된다.
from time import sleep
from threading import Thread
def infinite_loop():
while True:
sleep(1)
print('Infinite Loop Thread!')
if __name__ == '__main__':
# 스레드 생성 후 데몬 스레드 설정하기
t = Thread(target=infinite_loop)
t.daemon = True
# 스레드 생성 시 데몬 스레드 설정하기
t = Thread(target=infinite_loop, daemon=True)
t.start()
print('Script Start!')
sleep(5)
print('sleep 5sec')
print('Script End!')
위와 같이 무한 루프를 도는 스레드를 데몬 스레드로 설정해 주면 메인 스레드가 끝날 때 같이 종료되는 것을 확인할 수 있다.
2. threading 모듈의 Event 객체를 이용하여 서브 스레드 종료시키기
threading 모듈의 Event 객체를 플래그와 같이 사용할 수 있다.
Event 객체의 set()을 호출하면 객체의 내부 플래그 값을 True로 설정하고, clear()를 호출하면 내부 플래그 값을 False로 설정한다.
is_set()을 사용하여 내부 플래그 값이 참인지 거짓인지 확인할 수 있는데 이를 사용하여 특정 조건일 경우 서브 스레드를 종료시킬 수 있다.
from time import sleep
from threading import Thread, Event
event = Event()
def infinite_loop():
while True:
sleep(1)
if event.is_set():
print('Infinite Loop Stop!')
return
print('Infinite Loop Thread!')
if __name__ == '__main__':
t = Thread(target=infinite_loop, daemon=True)
t.start()
print('Script Start!')
for i in range(1, 6):
sleep(3)
print('for loop #{}'.format(i))
if i == 2:
event.set()
print('Script End!')
무한 루프를 도는 스레드에서 Event 객체의 플래그 값이 True가 될 경우 종료를 시키는 부분을 추가하였다.
메인 스레드에서 2번째 for 루프를 돌 때 Event 객체의 플래그 값을 True로 설정할 경우 무한 루프 스레드는 종료가 되는 것을 확인할 수 있다.
728x90
'Python' 카테고리의 다른 글
[Selenium] Selenium 화면에서 요소가 사라질 때까지 대기하기 (0) | 2022.12.20 |
---|---|
[Selenium] Selenium에서 크롬 확장 프로그램 사용하기 (feat. Google Chrome 설치된 확장 프로그램에서 crx 파일 추출하기) (0) | 2022.12.01 |
[Selenium] Selenium 창 크기(윈도우 사이즈) 조절하기 (0) | 2022.04.01 |
[Python] 폴더가 존재하지 않을 경우에만 폴더 만들기 (0) | 2022.03.31 |
[Python] __init__.py 뭐하는 파일인가요? (0) | 2022.01.10 |