필요할 때마다 야매로 배워서 써먹는중.
작성한 코드를 병렬적으로 실행시키기 위해선 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()도 하지 못하고 같이 끝나버리게된다.
'프로그래밍언어 > python' 카테고리의 다른 글
[파이썬문법] 13. 고급파이썬문법(1) (0) | 2022.04.18 |
---|---|
[파이썬] openpyxl & selenium 활용법 (0) | 2022.02.08 |
[파이썬문법] 11. Class(2) (0) | 2022.01.16 |
[파이썬문법] 11. Class(1) (0) | 2022.01.15 |
[파이썬문법] 9. 반복문 (0) | 2021.12.15 |