데몬 스레드(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
이 종료되어 더 이상의 숫자를 출력하지 않는 것을 확인할 수 있다.
'개인 공부 > 파이썬' 카테고리의 다른 글
[FastAPI] Mounting으로 FastAPI 기본 경로 설정하기 (0) | 2023.03.14 |
---|---|
[FASTAPI] FastAPI server가 시작될 때 인공지능 모델 load하기 (0) | 2023.03.14 |
[Python] 멀티 스레드 - 4 (Dead Lock) (0) | 2022.12.23 |
[Python] 멀티 스레드 - 3 (Lock) (0) | 2022.12.23 |
[Python] 멀티 스레드 - 1 (0) | 2022.12.23 |