본문 바로가기
  • Fearless
프로그래밍언어/python

[파이썬문법] 12. Threading(1)

by Albatross 2022. 1. 21.
반응형

필요할 때마다 야매로 배워서 써먹는중.

작성한 코드를 병렬적으로 실행시키기 위해선 Threading 모듈이 필요하다. 

 

import threading

def sum(low, high):
    total = 0
    for i in range(low, high):
        total += i
    print("Subthread", total)

t = threading.Thread(target = sum, args(1,10000))
t.start()

print("Main Thread")

가령 위 예시와 같이 최소, 최대의 인수를 넘겨받아 최소에서 최대까지의 합게를 반환하는 함수가 있다고 가정하자. 

이 때 특정 thread를 통해 해당 함수를 실행하기 위해선 threading.Thread(target = 'method_name', args = ( , ))의 형식으로 thread를 할당 후 start()를 실행하면 된다. 

실제 해당 코드를 실행했을 때, t.start()가 print()문에 선행했음에도 불구하고, main thread로서의 print()가 먼저 실행되고, subthread인 t가 추후에 실행된다. 

 

import threading, time

class sum(threading.Thread):
    def __init__(self, low, high):
        threading.Thread.__init__(self)
        self.low = low
        self.high = high
    def run(self):
        total = 0
        for i in range(self.low, self.high):
          total += i
        time.sleep(1)
        print("Subthread", total)

t = sum(1,10)
t.start()
print("Main Thread")

같은 결과이지만 위 예시처럼 class의 하위 method로 run을 활용하는 방법도 있다. 

start()가 class 내부의 run을 호출하기 때문에 가능한 것이다. 다만 이를 실제로 돌려보니 subthread가 먼저 출력되는 일이 잦았는데, thread를 달리 해줬을 뿐이지 그리 복잡한 작업이 아니기 때문에 먼저 계산된 subthread가 먼저 출력되었다. 따라서 time.sleep(n)을 통해 main과 sub간의 출력 시간 차이를 둘 수 있다. 

 

import threading, time

def sum(low, high):
    total = 0
    for i in range(low, high):
    	total += i
    time.sleep(1)
    print("Subthread", total)

t = threading.Thread(target = sum, args(1,10))
t.daemon = True
t.start()

print("main thread")

Thread 중 daemon Thread가 있다. 이는 main thread 종료시 즉시 종료되는 특성을 갖는다. daemon이 아닌 subthread는 main이 종료되더라도 작업이 끝날 때까지 실행된다. 

위 예시에선 subthread를 daemon으로 지정해주었기 때문에(t.daemon = True) main thread의 끝인 print()가 실행되었으니 subthread print()도 하지 못하고 같이 끝나버리게된다. 

반응형