스레드가 종료될 때까지 메인 프로그램을 대기시키기 위한 방법을 이해합니다.
목차
개발 의도
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()이 남용되면 프로그램의 성능이 떨어질 수 있습니다.
'개발 > 오늘의 개발일지' 카테고리의 다른 글
[Python] 빈 배열 변수에 배열 쌓는 방법 이해하기 (0) | 2024.11.18 |
---|---|
[Python] 한줄로 print 문을 출력하기 위한 캐리지 리턴 이해하기 (0) | 2024.11.17 |
[Python] 메인 프로그램과 함께 종료되는 데몬 스레드 이해하기 (0) | 2024.11.15 |
[Python] 하나의 변수에 여러 스레드가 접근하는 것을 막기 위한 Lock 이해하기 (2) | 2024.11.14 |
[Python] 바이트 문자열과 바이트 배열의 차이 이해하기 (0) | 2024.11.13 |