[Python] 멀티 스레드 - 2 (데몬 스레드)

AirPlaneMode·2022년 1월 23일
0

파이썬

목록 보기
2/4

데몬 스레드(Deamon thread)란 일반 스레드를 보조하는 역할을 하는 스레드를 의미한다. 데몬 스레드는 메인 스레드가 종료되면 그 즉시 종료된다.

일반 스레드

import threading
import time

def count(num, t, thread_num):
    print(f"thread {thread_num} starts")

    for i in range(num):
        print(f"thread {thread_num} running {i}")
        time.sleep(t)

    print(f"thread {thread_num} ends")

thread_1 = threading.Thread(target = count, args = (10, 0.1, 1))

thread_1.start()
count(5, 0.1, 2)

본 실험에서는 두 개의 스레드 (thread_1, MainThread)를 사용한다. 각 스레드는 시작할 때 count 함수를 실행하는데, 이는 t만큼의 간격으로 num까지의 숫자를 출력하는 함수이다.

thread_1은 0부터 10까지의 숫자를 0.1초 간격으로 출력하고, thread_2(MainThread)는 0부터 5까지의 숫자를 0.1초 간격으로 출력한다.

본 코드의 실행 결과는 다음과 같다.


thread 1 starts
thread 1 running 0
thread 2 starts
thread 2 running 0
thread 2 running 1
thread 1 running 1
thread 2 running 2
thread 1 running 2
thread 1 running 3
thread 2 running 3
thread 2 running 4
thread 1 running 4
thread 1 running 5
thread 2 ends
thread 1 running 6
thread 1 running 7
thread 1 running 8
thread 1 running 9
thread 1 ends

아무래도 thread_2(MainThread)는 출력할 숫자가 적다 보니 thread_1보다 먼저 종료되며, 남은 thread_1만 계속되어 실행되는 모습을 확인할 수 있다.

이제 thread_1을 데몬 스레드로 만들어보자. thread_1이 데몬 스레드가 된다면, 메인 스레드가 종료되는 그 즉시 실행을 멈출 것이다.

데몬 스레드

import threading
import time

def count(num, t, thread_num):
    print(f"thread {thread_num} starts")

    for i in range(num):
        print(f"thread {thread_num} running {i}")
        time.sleep(t)

    print(f"thread {thread_num} ends")

thread_1 = threading.Thread(target = count, args = (10, 0.1, 1))

#thread_1.setDaemon(True) # 데몬 스레드로 설정
thread_1.daemon = True
thread_1.start()

count(5, 0.1, 2)

특정 스레드를 데몬 스레드로 만들기 위해서는 Daemon 변수를 True 값으로 바꿔주면 된다.

위 코드 처럼 thread.setDaemon(True)thread.daemon = True와 같은 방식으로 Daemon 변수를 바꿔줄 수 있다.

이 중 setDaemon 함수는 파이썬 3.10 버전부터 deprecated 된다고 하니, property에 직접 접근해서 수정하는 두 번째 방식으로 하라고 공식 문서에 나와 있다.

본 코드의 실행 결과는 다음과 같다

thread 1 starts
thread 1 running 0
thread 2 starts
thread 2 running 0
thread 2 running 1
thread 1 running 1
thread 1 running 2
thread 2 running 2
thread 1 running 3
thread 2 running 3
thread 2 running 4
thread 1 running 4
thread 1 running 5
thread 2 ends

thread_2 (MainThread)가 종료된 이후, thread_1이 종료되어 더 이상의 숫자를 출력하지 않는 것을 확인할 수 있다.

0개의 댓글