2017 멀티캠퍼스/Python

[Python] #15 파이썬 쓰레드(Thread) 개념과 예제

꿈꾸는어린이 2018. 1. 17. 18:19

//

일시 : 2018.01.17

내용 : 파이썬 스레드(thread) 검색해보며 공부

//



스레드(Thread)

  • 1개의 프로세스(컴퓨터에서 동작하고 있는 프로그램)는 한가지 일을 하지만, 스레드를 이용하여 2가지 이상의 일을 동시에 수행할 수 있다.

  • 예를 들어 실시간 채팅을 하는 코드를 만들 때, 송신하는 코드와 수신하는 코드를 별개로 작동시킬 수 있다.

  • threading 모듈 이용. import threading

    threading에서 내장 모듈인 Thread를 상속받음.

  • threading.Thread 클래스를 상속받는 클래스를 만들어서 run() 하여 객체 생성

    ★★ Thread를 구동하기 위해서는 함수명을 run으로 해야함

    ​ MyThread로 생성된 객체를 start() 메소드를 실행할 때 run 메소드가 자동으로 수행.

  • thread 객체 생성 후 start() 메소드를 통해 thread 객체 실행

  • target은 스레드로 돌릴 함수, args는 입력 인자.

  • join() 메소드를 통해 스레드가 끝날 때까지 기다림



run 메소드 구현 시

★ 변수를 지정하지 않고 단순 반복을 하고 싶을 때는 _언더바를 사용한다.

  import threading
## threading 모듈을 이용

## threading.Thread를 상속받는 클래스를 만들어서 run하여 객체를 생성한다.
class Messenger(threading.Thread):
   
   def run(self):
       for _ in range(10):
           ## 변수를 지정하지 않고 단순 반복을 하고 싶을 때는 _언더바를 사용한다.
           print(threading.currentThread().getName())
           

send = Messenger(name="Sending out Messages")
receive = Messenger(name="Receiving Messages")

send.start()
receive.start()

>> 출력결과






run 메소드 없이 스레드 구현

  
from threading import Thread
import time

def my_thread(val):
   for i in range(3):
       print("I'm Thread")
       time.sleep(2)


## 인스턴스 만들기
## 첫번째 argu는 스레드 함수 이름, 두번째 argu는 매개변수를 튜플 형태로 전달한 것.
t1 = Thread(target = my_thread, args=(1,))

## 스레드 시작.
t1.start()

## main
for i in range(3):
   print("I'm main Thread")
   time.sleep(1)
print("----the end----")

>> 출력결과


위의 결과를 보면 프롬프트 명령창에 스레드가 출력된 것을 볼 수 있다.

스레드가 끝날 때까지 기다리는 명령 join() 함수를 써보자.

  
from threading import Thread
import time

def my_thread(val):
   for i in range(3):
       print("I'm Thread")
       time.sleep(2)


## 인스턴스 만들기
## 첫번째 argu는 스레드 함수 이름, 두번째 argu는 매개변수를 튜플 형태로 전달한 것.
t1 = Thread(target = my_thread, args=(1,))

## 스레드 시작.
t1.start()

## main
for i in range(3):
   print("I'm main Thread")
   time.sleep(1)
print("----the end----")
t1.join()


>> join() 함수를 추가하니 스레드가 종료될 때까지 기다린 것을 볼 수 있다.

  
from threading import Thread
import time

def my_thread(val):
   for i in range(3):
       print("I'm Thread")
       time.sleep(1)


## 인스턴스 만들기
## 첫번째 argu는 스레드 함수 이름, 두번째 argu는 매개변수를 튜플 형태로 전달한 것.
t1 = Thread(target = my_thread, args=(1,))

## 스레드 시작.
t1.start()
t1.join()

## main
for i in range(3):
   print("I'm main Thread")
   time.sleep(1)
print("----the end----")


>> join()함수를 main함수 전에 써주면 자식 스레드가 다 출력된 후 메인이 출력된 것을 확인할 수 있다.