Python

[Python] Python Thread 종료 시키기

메바동 2022. 4. 30. 22:59
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