본문 바로가기
개발/오늘의 개발일지

[Python] 스레드 종료를 기다리기 위한 join 이해하기

by 꾀돌이 개발자 2024. 11. 16.
반응형

 

스레드가 종료될 때까지 메인 프로그램을 대기시키기 위한 방법을 이해합니다.

 

 

 

목차

     

    개발 의도

    import threading
    import time
    
    count = 0
    
    def worker():
        global count
        print("Worker thread is starting")
        for i in range(5):
            count += 1
            time.sleep(1)
        print("Worker thread has finished")
    
    # 스레드 생성
    thread = threading.Thread(target=worker)
    
    # 스레드 시작
    thread.start()
    
    # count 값 출력
    print(count)
    
    # 출력값: Worker thread is starting / 0 / (5초 뒤) Worker thread has finished.

    - 위와 같이 count 변수를 1씩 증가시키는 스레드와

          count 계산 결과를 출력하는 코드를 작성합니다.

     

    - 스레드에서 count가 1씩 5번 더해지기 때문에

          최종 출력값은 5가 되어야 합니다.

     

    문제 상황

    - 코드를 실행했을 때,

          스레드가 종료되기 전에 count값이 0으로 먼저 출력되고,

          5초 뒤 "Worker thread has finished"가 출력됩니다.

     

    문제 원인 파악

    - 메인 프로그램이 스레드를 생성한 뒤,

          생성된 스레드의 종료를 기다리지 않고 종료됩니다.

     

    - 스레드가 threading 모듈의 join() 메서드와 함께 생성되었다면,

          메인프로그램은 종료되기 전에 해당 스레드의 종료를 기다립니다.

     

    join() 메서드를 통한 문제 해결

    import threading
    import time
    
    def worker():
        print("Worker thread is starting")
        time.sleep(2)
        print("Worker thread has finished")
    
    # 스레드 생성
    thread = threading.Thread(target=worker)
    
    # 스레드 시작
    thread.start()
    
    # 스레드가 종료될 때까지 대기
    thread.join()
    
    # count 값 출력
    print(count)
    
    # 출력값: Worker thread is starting / Worker thread has finished / 5

    - join() 메서드는 현재 실행 중인 스레드(혹은 메인 프로그램)를 멈추고,

          지정한 스레드가 종료될 때까지 기다리게 만듭니다.

     

    - 이렇게 하면 지정된 스레드가 끝날 때까지

          메인 프로그램이나 다른 스레드가 실행되지 않도록 할 수 있습니다.

     

    join() 메서드 특성

    - 동기화: 여러 스레드가 병렬로 실행되는 프로그램에서

          특정 작업이 완료될 때까지 기다려야 할 때 사용합니다.

    - 타임아웃: join() 메서드는 선택적으로 타임아웃을 지정할 수 있습니다.

          예를 들어, thread.join(5)는 최대 5초 동안만 대기합니다.

     

    아래 코드로 디버깅 완료

    import threading
    import time
    
    def worker():
        print("Worker thread is starting")
        time.sleep(2)
        print("Worker thread has finished")
    
    # 스레드 생성
    thread = threading.Thread(target=worker)
    
    # 스레드 시작
    thread.start()
    
    # 스레드가 종료될 때까지 대기
    thread.join()
    
    # count 값 출력
    print(count)
    
    # 출력값: Worker thread is starting / Worker thread has finished / 5

    - join()을 사용하면 프로그램이 멈추고 스레드가 완료될 때까지 기다리므로,

          필요하지 않을 때는 사용하지 않는 것이 좋습니다.

     

    - join()이 남용되면 프로그램의 성능이 떨어질 수 있습니다.

    반응형