Python - Threading.Thread

2020. 3. 16. 10:52Python Study

Thread

파이썬 프로그램은 기본적으로 Single Thread에서 실행된다. 즉 하나의 main thread가 python code를 순차적으로 실행하게 된다. 코드를 병렬(Parallel)로 실행하기 위해서 Subhread를 생성해야 하는데, 파이썽네서 쓰레드를 생성하기 위해 threading module을 통한 High Levelthread module을 통한 Low Level을 사용할 수 있다. thread모듈을ㅇ 넉의 deprecate되어 사용되지 않고 대부분 threading모듈을 사용하고 있다.

Threading Module

파이썬에서 threading module의 threading.Thread() 함수를 호출하여 Thread 객체를 얻은 후, Thread 객체의 start() method를 호출하면 된다. Sunthread를 통해 method 혹은 함수를 실행할 때, 구현방식은 두 가지로 나뉜다.
1. Thread가 실행할 함수 또는 메서드를 작성하는 방식
2. threading.Thread로부터 파생된 파생클래스를 작성하여 사용

threading Module Usage

먼저 코드사용부터 살펴본다.

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, 100000))
t.start()

print("Main Thread")

sum()이라는 쓰레드가 실행할 함수를 작성하여 사용하는 케이스이다.

threading.Thread Usage

thrading.Thread로부터 파생클래스를 만드는 방식이다. Thread 클래스를 파생하여 스레드가 실행할 run() 메서드를 재정의해서 사용하는 방식이다. 코드를 먼저 살펴보자.

import threading, requests, time

def getHtml(url):
    resp = requests.get(url)
    time.sleep(1)
    print(url, len(resp.text), ' chars')

t1 = threading.Thread(target=getHtml, args('http://google.com', ))
t1.start()

위 코드는 먼저번 살펴본 threading module을 이용한 방식이고 이를 파생클래스를 사용하는 방식으로 바꿔서 사용해보면,

import threading. requests, time

class HtmlGetter(threading.Thread):
    def __init__(self, url):
        threading.Thread.__init__(self)
        self.url = url

    def run(self):
        resp = requests.get(self.url)
        time.sleep(1)
        print(self.url, len(resp.text), ' chars')

t = HtmlGetter('http://google.com')
t.start()

위 예제에서 t.start()는 HtmlGetter 클래스에서 재 정의된 run() 메서드를 호출하게 된다.