쓰레드에 대해 설명하려먼 먼저 프로세스의 개념에 대해 이해해야 한다. 프로세스란 실행가능한 프로그램이 있을 때 그 프로그램이 동시에 여러개가 동작할 수 있도록 메모리 작업을 하는데 이때 프로세스 내에서 실제적으로 작업을 하는게 쓰레드이다.
예를 들어 워드프로램에서 문서를 작성한다고 치자. 그럼 우리한테 보이지 않는 곳에서 맞춤법 검사, 입력받은 데이터를 모니터에 출력하는 등등 여러 기능들이 동시에 작업할 것이다. 이렇게 동시 작업하는 것을 바로 쓰레드의 개념이라고 할 수 있다.
다음 예제로 쓰레드가 필요한 경우를 알아보자.
1
2
3
4
5
6
7
8
9
|
def show():
while True:
i = int(input("정수>"))
if i == 0:
break;
show() # show 메서드가 끝나야 아래 for문이
for i in range(5):
print(i)
|
cs |
위 코드를 실행하고 0을 입력해야 줄8의 for문이 실행된다. 만약 0을 입력하지 않을 경우 for문은 영원히 실행되지 않을 것이다. 이는 파이썬은 순차적 구조이기 때문이다.
따라서 show() 메서드와 for문을 동시에 실행시키고 싶을 때 사용하는 것이 쓰레드이다. 쓰레드를 적용시키면 show() 와 for문이 각각 따로 움직이게 된다.
1 Thread
threading 모듈 내의 Thread 클래스를 상속받아서 사용한다. 그리고 상속받은 클래스에서 run() 메서드를 사용하여 쓰레드가 실행할때 수행해야 하는 구문을 작성한다.
그리고 Thread 를 상속받은 객체에 start() 메서드를 호출하여 실행할 때 run() 메서드가 자동으로 실행된다.
Thread 객체의 자식클래스 생성 후 star() 메서드 실행, target은 스레드로 돌릴 함수, args 은 입력입자이다.
join() 메서드는 쓰레드가 끝날때 까지 기다리라는 메서드이다.
main() 메서드도 파이썬 프로그램이 시작하고 나서 명령문들을 실행하는 메서드이기 때문에 쓰레드이기도 하다.
그래서 main 쓰레드라고도 한다.
2 싱글쓰레드
싱글 쓰레드는 우리가 일반적으로 작성하는 코드랑 똑같이 순차적으로 실행한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from time import*
from threading import Thread
def my():
for i in range(3):
print("I'm Thread")
sleep(1)
my()
for i in range(3):
print("I'm main Thread")
sleep(0.5)
print("end")
|
cs |
my()가 끝나고나서야 for문을 실행한다. 순차적 구조로 진행되는데 이것이 싱글스레드이다.
3 멀티쓰레드
run() 없이 만들 경우 아래와 같이 Thread 객체를 생성하고 안에 적용시킬 함수 이름을 target에 넣는다. 그리고 매개변수값 (args=)를 전달해야 하는데 이를 튜플형태로 전달해 준다.
객체명 = Thread(첫번째 스레드 함수이름 , 매개변수'args'를 튜플형태로 전달)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from time import*
from threading import Thread
def my(val):
for i in range(3):
print("I'm Thread")
sleep(1)
t1 = Thread(target=my,args=(1,)) # 튜플로 전달
t1.start()
for i in range(3):
print("I'm main")
sleep(0.5)
print("end")
|
cs |
줄9에서 쓰레드 객체를 만들어 t1에 담아주었고 target을 my()메서드로 설정하였다. 그리고 매개변수의 인자값(agrs)으로 튜플형태의 (1,)을 넣어줬다.
따라서 위의 실행결과를 보면 알 수 있다시피 쓰레드를 적용시킨 my()메서드와 for문이 따로 작동하는 것을 볼 수 있다.
4 join()
join() 메서드는 다른 쓰레드가 끝날때까지 기다리라는 메서드이다.
위의 코드에 join() 메서드를 적용시켜보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from time import*
from threading import Thread
def my(val):
for i in range(3):
print("I'm Thread")
sleep(1)
t1 = Thread(target=my,args=(1,)) # 튜플로 전달
t1.start()
t1.join()
for i in range(3):
print("I'm main")
sleep(0.5)
print("end")
|
cs |
t1 쓰레드가 끝날때까지 for문이 실행되지 않는다.
5 Thread 상속
run()을 사용하는 예제이다. Thread 를 상속받은 클래스의 생성자에 부모의 생성자를 꼭 호출해줘야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from threading import* # threading 모듈 import
from time import*
class MyThread(Thread): # Thread 클래스 상속
def __init__(self,msg):
Thread.__init__(self) # super().__init__ 라고 해도된다.
self.msg = msg
def run(self): # 수행할 명령문을 작성
while True:
sleep(1)
print(self.msg)
# main()
for msg in ['you','need','python']:
t = MyThread(msg) # 쓰레드 인스턴스 생성
t.start() # 쓰레드 실행
for i in range(100):
sleep(0.1)
print(i)
|
cs |
쓰레드클래스와 for문이 따로 작동한다.
하지만 줄19의 for문이 끝나도 줄15의 for문은 계속 실행된다. 이를 해결하기 위한 것이 바로 데몬 쓰레드이다.
6 데몬 Thread
데몬쓰레드를 사용하면 메인 프로그램이 종료될때 자동으로 같이 종료된다. daemon의 초기값은 False로 세팅되어 있는데 사용할 때는 이를 True로 바꿔주면 된다.
객체.daemon = True
또는
객체.setDaemon(True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from threading import* # threading 모듈 import
from time import*
class MyThread(Thread): # Thread 클래스 상속
def __init__(self,msg):
Thread.__init__(self) # super().__init__ 라고 해도된다.
self.msg = msg
def run(self): # 수행할 명령문을 작성
while True:
sleep(1)
print(self.msg)
# main()
for msg in ['you','need','python']:
t = MyThread(msg) # 쓰레드 인스턴스 생성
t.daemon = True # 데몬 스레드
t.start() # 쓰레드 실행
for i in range(100):
sleep(0.1)
print(i)
|
cs |
줄20의 for문의 반복이 종료되면 줄15의 반복도 daemon에 의해 같이 종료된다.
'Python' 카테고리의 다른 글
[Python 기초] 파이썬 - 연산자 오버로딩 (0) | 2021.04.08 |
---|---|
[Python 기초] 파이썬 if __name__ == "__main__" 란? (0) | 2021.04.08 |
[Python 기초] 파이썬 자료형 - 집합(set) (0) | 2021.04.08 |
[Python 기초] 파이썬 random 모듈 - choice() , randint() , randrange() , sample() , shuffle() (0) | 2021.04.07 |
[Python 기초] 파이썬 클래스 - 클래스 멤버(static) 와 접근제어자(public , private , getter , setter) (0) | 2021.04.05 |
댓글