(수업내용 : Fork와 join()
- 반복문을 통해 여러 서브 스레드를 생성해야 하는 경우에는 생성된 스레드 객체를
파이썬 리스트에 저장한 후 반
복문을 이용해서 각 객체에서 join( ) 메서드를 호출할 수 있다.
import threading
import time
class Worker(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name # thread 이름 지정
def run(self):
print("sub thread start ", threading.currentThread().getName())
time.sleep(5)
print("sub thread end ", threading.currentThread().getName())
print("main thread start")
threads = []
for i in range(3):
thread = Worker(i)
thread.start() # sub thread의 run 메서드를 호출
threads.append(thread)
for thread in threads:
thread.join()
print("main thread post job")
print("main thread end")
데몬(daemon)스레드란?
- 데몬(daemon) 스레드는 메인 스레드가 종료될 때 자신의 실행 상태와 상관없이 종료되는 서브 스레드를 의미한
다. 앞서 threading 모듈을 사용해서 메인 스레드가 서브 스레드를 생성하는 경우 메인 스레드는 서브 스레드가
모두 종료될 때까지 기다리지 않고 종료하게 된다. 그런데 실제
프로그래밍을 하다 보면 경우에 따라 메인 스레
드가 종료되면 모두 서브 스레드가 동작 여부에 상관없이 종료되어야 하는 경우가 많다. 예를 들어 네이버 메일
이나,
파이썬 인터프리터와 같이 이런 것들은 메인 스레드가 종료되면 같이 종료가 되어야 할 것이다. 이때 서브
스레드 들은 데몬 스레드로 만들어져야 한다.
파이썬 threading 모듈에서 데몬 스레드의 생성은 daemon 속성을
True로 변경하면 된다.
class Worker(threading.Thread):
def __init__(self, name):
self.name = name # thread 이름 지정
def run(self):
print(“sub thread start “, threading.currentThread().getName())
time.sleep(3)
print(“sub thread end ", threading.currentThread().getName())
print("main thread start")
for i in range(5):
name = "thread {}".format(i)
t = Worker(name) # sub thread 생성
t.daemon = True # 작업스레드를 데몬으로 설정
t.start() # sub thread의 run 메서드를 호출
print("main thread end")) Fork와 join()
- 위의 그림처럼 메인 스레드가 서브 스레드를 생성하는 것을 fork 라고 한다. 두 개의 서브 스레드를 생성하는
경우 메인 스레드를 포함하여 총 3개의 스레드가 스케줄링 된다. join은 모든 스레드가 작업을 마칠 때까지 기다
리라는 것을 의미한다. 보통 데이터를 여러 스레드를 통해서 병렬로 처리한 후 그 값들을 다시 모아서 순차적으
로 처리해야할 필요가 있을 때 분할한 데이터가 모든 스레드에서 처리될 때까지 기다렸다가 메인 스레드가 다시
추후 작업을 하는 경우에 사용한다.
import threading
import time
class Worker(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name # thread 이름 지정
def run(self):
print("sub thread start ", threading.currentThread().getName())
time.sleep(5)
print("sub thread end ", threading.currentThread().getName())
print("main thread start")
t1 = Worker("1") # sub thread 생성
t1.start() # sub thread의 run 메서드를 호출
t2 = Worker("2") # sub thread 생성
t2.start() # sub thread의 run 메서드를 호출
t1.join()
t2.join()
print("main thread post job")
print("main thread end")
출력결과
main thread start
sub thread start 1
sub thread start 2
sub thread end 1
sub thread end 2
main thread post job
main thread end
- 출력결과를 보면 t1, t2 스레드가 종료된 후 'main thread post job'이 출력된 것을 확인할 수 있다. 참고로 앞의
예제에서는 메인스레드는 모든 실행을 완료한 후 먼저 종료되는 경우가 많지만 이번 예제에서는 join()로 인해 서
브스레드가 join( ) 메서드가 호출되는 지점에서 기다린다는 차이가 있다.
출력결과
main thread start
sub thread start 0
sub thread start 1
sub thread start 2
sub thread end 2
sub thread end 0
sub thread end 1
main thread post job
main thread end 좋은 강의 잘 들었습니다. 항상 친절하고 명쾌한 강의를 하시느라 정말 고생하셨습니다. 저도 강사님의 강의에 더 열심히 공부하겠습니다. 앞으로도 좋은 강의 잘 부탁드립니다 .감사합니다. 수고 많으셨습니다.^^