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

[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()이 남용되면 프로그램의 성능이 떨어질 수 있습니다.

반응형