[python] Multi Thread

Hesoyam·2021년 4월 2일
0

TIL

목록 보기
3/5

Python에서 Multi Thread 구현

  • Python에서 Multi Thread를 구현하려면 threading 모듈을 이용해야 합니다.

Document : threading module docs

우선 쓰레드란 무엇인지 부터 설명하겠습니다.

Thread란

운영 체제가 프로세서 시간을 할당하는 기본 단위를 말합니다.
일반적으로 Thread는 한 프로세스에서 하나의 Thread만 동작을 하지만 프로세스 환경에 따라 둘 이상의 스레드를 동시에[병렬로] 실행할 수 있습니다.
이러한 방식을 Multi Thread라고 부릅니다.


참고 : https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)

위의 그림을 보면 한 Process에 2개의 Thread가 돌아가는것을 확인할 수 있습니다. 이러한 방식이 Multi Thread 방식 이며, Multi Thread의 장점은 같은 Process 내의 메모리를 공유해서 스레드 간의 전환 속도가 빠르다는 장점과 CPU가 여러개인 경우 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있습니다.

  • 이러한 경우 시스템에서는 여러 스레드가 실제 시간상으로 동시에 동작하기 때문입니다.

그리고 단점으로는 각각의 Thread 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는것이 있습니다.

Multi Thread 구현

그림 실제로 Python 코드의 threading 모듈을 사용해 Multi Thread를 구현해 보겠습니다.

스레드는 threading 모듈의 Thread 클래스를 상속받아서 구현하는 방법과 인스턴스화 하여 스레드를 생성하는 방법이 있습니다.

1.클래스를 상속받아서 Thread 구현

class Worker:
    def run(self):
        print("working")
    def join(self):
        print("work is done")

class Worker(Thread):
    def run(self):
        print("working")
    def join(self):
        print("work is done")

work1 = Worker()
print("work1 ", work1.run)
# Trhead 호출

work2 = Worker()
print("work2 ", work2.run)

# 호출된 Thread가 종료될 때까지 호출 스레드를 차단
print("work2 ", work2.join) 
print("work1 ", work1.join) 

Thread 구현의 2번째 방법인 인스턴스화를 하기 위해선 Thread 클래스에 인자로 targetargs 값을 넣어 줍니다. args에 넣어 준 파라미터는 스레드 함수의 인자로 넘어갑니다.

t = Thread(target=함수이름, args=())

Thread 클래스에는 start(), join() 같은 스레드 동작 관련 메소드가 있습니다. Thread로 실행할 함수를 정의한 후 start() 를 통해 스레드를 실행합니다.

from threading import *
from time import sleep

Stop = False
def worker(work, sleep_sec):    # 일꾼 스레드입니다.
    while not Stop:   # 그만 하라고 할때까지
        print('do ', work)    # 시키는 일을 하고
        sleep(sleep_sec)    # 잠깐 쉽니다.
    print('retired {}\n'.format(work))     # 일에서 벗어나면 은퇴를 시켜줍니다.

# 일꾼 스레드를 2개 생성합니다. 
# 일한 후 5초간 쉽니다.
t1 = Thread(target=worker, args=('work_1', 5))    
t2 = Thread(target=worker, args=('work_2 ', 5))

# 일꾼에게 일을 시킵니다.
t1.start()   
t2.start()

일을 그만하라고 하지 않으면 일을 계속 수행하므로 join()을 사용해 thread를 종료하게 만듭니다.


 # Thread에게 일을 그만하라고 합니다.
Stop = True   

# 일꾼 스레드가 종료할때까지 기다립니다. 
def stopWorking(work): 
    work.join()

stopWorking(t1)
stopWorking(t2)
print('worker is gone.')

위에서 순서대로 Thread 함수를 호출하고 종료하게 만들었기에 Thread가 순서대로 호출되고 종료가 될것입니다.


이렇게 간단하게 Thread에 대해 정리를 해보았는데요. Thread는 프로그래밍을 할 때 중요하게 사용되어서 개념을 확실히 이해하고 여러번 연습을 하는것이 중요합니다.

Reference

profile
거북이가 되고 싶은 자라

0개의 댓글