(수업내용 : Fork와 join()
- 출력결과를 보면 t1, t2 스레드가 종료된 후 'main thread post job'이 출력된 것을 확인할 수 있다. 참고로 앞의
예제에서는 메인스레드는 모든 실행을 완료한 후 먼저 종료되는 경우가 많지만 이번 예제에서는 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")
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 Fork와 join()
- 반복문을 통해 여러 서브 스레드를 생성해야 하는 경우에는 생성된 스레드 객체를
파이썬 리스트에 저장한 후 반
복문을 이용해서 각 객체에서 join( ) 메서드를 호출할 수 있다.
thread end) 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")
출력결과
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
데몬(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")
실행 결과는 보시다시피 메인스레드가 종료가 되니 “sub thread
end”라는 문자열이 출력이 되질 않는다.다시 말해 메인스레드
가 종료가 되니 서브(작업)스레드들도 같이 종료가 되어 출력이
되질 않은 것이다. 추운데 오늘도 좋은 강의 잘 들었습니다 .항상 정확하고 자세하게하는 강의 정말 좋습니다. 저도 강사님의 열심하는 모습을 잘 받아드려 열심히 공부하겠습니다. 수고하셨습니다. 감사합니다.^^