본문으로 바로가기

파이썬 쓰레드(Thread) 알아보기 - 1

category Language/Python 2020. 8. 12. 11:36

쓰레드(Thread)

  • 쓰레드는 프로그램 내에서 실행되는 흐름의 단위를 말한다.

  • 일반적으로 한 프로그램 하나의 쓰레드를 가지고 있지만, 둘 이상의 스레드를 동시에 실행할 수 있으며 이를 멀티 쓰레드라고 한다.

 

예제 1

 

기본적인 쓰레드 실행방법입니다.

import threading
import time

def run(n):
    for i in range(10):
        time.sleep(0.1)
        # print(f'{n} : {i}')
    print(f'* [{n} done]')
    rank.append(n)

if __name__ == '__main__':
    players = ['rabbit', 'turtle', 'horse']
    for player in players:
        threading.Thread(target=run, args=(player,)).start()
* [turtle done]
* [horse done]
* [rabbit done]

...

* [turtle done]
* [rabbit done]
* [horse done]

 

target 파라미터에 쓰레드로 실행할 함수명을 주고 args 파라미터는 그 함수의 파라미터를 튜플로 받습니다.

실행은 쓰레드 객체의 start() 함수를 호출하면 됩니다. 

threading.Thread(target=run, args=(player,)).start()

 

 

예제 2

 

데몬 속성을 True 로 설정했을 때의 예제입니다.

결과는 아무것도 출력되지 않습니다.

import threading
import time

def run(n):
    for i in range(10):
        time.sleep(0.1)
        # print(f'{n} : {i}')
    print(f'* [{n} done]')

if __name__ == '__main__':
    players = ['rabbit', 'turtle', 'horse']
    for player in players:
        t = threading.Thread(target=run, args=(player,))
        t.daemon = True
        t.start()

 

데몬 쓰레드는 메인 쓰레드가 종료되면 즉시 종료되는 쓰레드입니다.

위의 예제는 데몬 쓰레드로 설정했기 때문에 서브 쓰레드들도 종료된 것입니다.

 

반면에, 1번 예제는 데몬 쓰레드가 아니므로 자신(서브쓰레드)의 작업이 끝날 때까지 계속 실행된 것입니다.

 

데몬 쓰레드 설정은 다음과 같이합니다.

t = threading.Thread(target=run, args=(player,))
t.daemon = True
t.start()

 

 

예제 3

 

join() 함수 사용에 대한 예제입니다.

 

join() 은 해당 쓰레드가 종료할 때까지 대기합니다.

다음과 같이 사용하면 쓰레드를 사용하지 않은 것과 동일합니다.

import threading
import time

def run(n):
    for i in range(10):
        time.sleep(0.1)
        # print(f'{n} : {i}')
    print(f'* [{n} done]')

if __name__ == '__main__':
    players = ['rabbit', 'turtle', 'horse']
    for player in players:
        t = threading.Thread(target=run, args=(player,))
        t.start()
        t.join()
* [rabbit done]
* [turtle done]
* [horse done]

 

다음과 같이 사용합니다.

import threading
import time

def run(n):
    for i in range(10):
        time.sleep(0.1)
        # print(f'{n} : {i}')
    print(f'* [{n} done]')

if __name__ == '__main__':
    players = ['rabbit', 'turtle']
    
    t1 = threading.Thread(target=run, args=(players[0],))
    t2 = threading.Thread(target=run, args=(players[1],))

    t1.start()
    t2.start()

    t1.join()
    t2.join()
* [turtle done]
* [rabbit done]