import logging
import threading
import time
스레드 사용을 위한 threading 라이브러리와 스레드 작업 확인 시간 체크를 위한 logging과 time 라이브러리를 사용했다.
def thread_func(name):
logging.info("Sub-Thread %s: starting", name)
time.sleep(3)
logging.info("Sub-Thread %s: finishing", name)
if __name__ == "__main__":
# Logging format 설정
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("Main-Thread : before creating thread")
# 함수 인자 확인
x = threading.Thread(target=thread_func, args=('First',))
logging.info("Main-Thread : before running thread")
# 서브 스레드 시작
x.start()
logging.info("Main-Thread : wait for the thread to finish")
logging.info("Main-Thread : all done")
결과를 살펴보면 메인 스레드가 서브 스레드를 실행시킨 후 바로 종료가 된다. 그러나 서브 스레드는 자기 작업을 끝낸 후 종료가 된다. 그러나 서브 스레드는 특별한 경우가 아니면 메인 스레드가 종료될 때 같이 종료되거나 서브 스레드가 종료될 때 까지 메인 스레드는 종료되선 안된다.
이때 사용할 수 있는 함수가 바로 join()과 Daemon()이다.
if __name__ == "__main__":
# Logging format 설정
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("Main-Thread : before creating thread")
# 함수 인자 확인
x = threading.Thread(target=thread_func, args=('First',))
logging.info("Main-Thread : before running thread")
# 서브 스레드 시작
x.start()
logging.info("Main-Thread : wait for the thread to finish")
# 주석 전후 결과 확인
x.join()
logging.info("Main-Thread : all done")
join()을 사용하게 되면 서브 스레드가 종료될 때 가지 메인 스레드가 대기하는 것을 확인할 수 있다.
if __name__ == "__main__":
# Logging format 설정
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("Main-Thread : before creating thread")
# 함수 인자 확인
# Deamon : Default False
x = threading.Thread(target=thread_func, args=('First', range(2000000)), daemon=True)
# x.daemon = True
y = threading.Thread(target=thread_func, args=('Second', range(3000000)), daemon=True)
logging.info("Main-Thread : before running thread")
# 서브 스레드 시작
x.start()
y.start()
logging.info("Main-Thread : wait for the thread to finish")
logging.info("Main-Thread : all done")
실행 결과를 보면 main 스레드가 끝이 나고 sub 스레드의 종료 로그 없이 프로세스가 종료되는 것을 확인할 수 있다.
데몬 스레드는 메인 스레드 종료시 즉시 종료되는 스레드로 주로 백그라운드에서 실행되며 이벤트 발생시 실행하는 부분을 담당한다.
데몬 스레드와 일반 스레드의 차이는 다음의 데몬 값을 False를 준 결과값과 비교해보면 바로 알 수 있다.