[분산 시스템] 1-2. Thread

gimseonjin616·2021년 12월 25일
0

분산시스템

목록 보기
3/14

사용 라이브러리

import logging
import threading
import time

스레드 사용을 위한 threading 라이브러리와 스레드 작업 확인 시간 체크를 위한 logging과 time 라이브러리를 사용했다.

메인 스레드와 서브 스레드 구현

서브 스레드 : time.sleep 함수를 통해 3초 동안 대기하는 함수 구현

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()이다.

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")
    
    # 함수 인자 확인
    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")

결과 with join

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")
    
    # 함수 인자 확인
    # 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")

실행 결과 with Daemon

실행 결과를 보면 main 스레드가 끝이 나고 sub 스레드의 종료 로그 없이 프로세스가 종료되는 것을 확인할 수 있다.

데몬 스레드는 메인 스레드 종료시 즉시 종료되는 스레드로 주로 백그라운드에서 실행되며 이벤트 발생시 실행하는 부분을 담당한다.

데몬 스레드와 일반 스레드의 차이는 다음의 데몬 값을 False를 준 결과값과 비교해보면 바로 알 수 있다.

  • 데몬 설정값을 False로 할 시, sub 스레드의 종료 로그가 출력이 됨
profile
to be data engineer

0개의 댓글