개요
Python 라이브러리 threading 모듈을 사용하여 스레드를 구현해보도록 하겠다.
코드
해당 코드는 두 개의 스레드를 생성해 실행하여 스레드 함수 내부 변수가 다른 스레드와 자원을 공유하는지 확인하는 코드이다.
from threading import Thread
import time
def threaded(thx):
result = 0
for i in range(1,5):
result += i
print(result, end="")
print('\t->'+thx)
time.sleep(3)
if __name__ == '__main__':
th1 = Thread(target=threaded, args=('th1',))
th2 = Thread(target=threaded, args=('th2',))
th1.start()
time.sleep(5)
th2.start()
th1.join()
th2.join()
print('finish')
Thread()
: 스레드 객체 생성target
: 스레드가 동작할 함수args
: 해당 함수의 파라미터start()
: 스레드 실행join()
: 스레드 처리가 끝날 때까지 대기
1 ->th1
3 ->th1
1 ->th2
6 ->th1
3 ->th2
10 ->th1
6 ->th2
10 ->th2
finish
결과를 확인해보면 각 스레드마다 독립적으로 1부터 4까지 값을 더해가며 출력한다.
-> 함수 내부에 있는 변수 result
는 다른 스레드와 자원을 공유해서 사용하지 않는다.
이번엔 result
변수를 전역변수로 선언해보겠다.
from threading import Thread
import time
def threaded(thx):
global result
for i in range(1,5):
result += i
print(result, end="")
print('\t->'+thx)
time.sleep(3)
if __name__ == '__main__':
result = 0
th1 = Thread(target=threaded, args=('th1',))
th2 = Thread(target=threaded, args=('th2',))
th1.start()
time.sleep(5)
th2.start()
th1.join()
th2.join()
print('finish')
1 ->th1
3 ->th1
4 ->th2
7 ->th1
9 ->th2
13 ->th1
16 ->th2
20 ->th2
finish
result
변수가 여러 스레드에서 서로 접근하여 값이 바뀐 것을 확인할 수 있다.
현재 코드에서는 sleep이 걸려있고, 값이 크지않아 result
변수에 동시에 접근하는 문제가 발생하지는 않지만
다른 스레드에서 접근 중인 변수에 동시에 접근하지 않게 하기 위해서는 동기화를 해줘야한다.
lock = threading.Lock()
lock 객체를 생성해준다.
lock.acquire()
try:
result += i
finally:
lock.release()
result
에 값을 더해주는 코드라인에 lock을 걸어주면 된다.
마무리
파이썬 스레드 처리에 대해서 알아보았다.
'개발 > Python' 카테고리의 다른 글
[Python] 파이썬 특정 문자 패딩 (문자열, 정수 앞에 0 채우기) (0) | 2021.11.17 |
---|---|
[Python] python 다중 공백 제거 (정규표현식) (0) | 2021.10.25 |
[Python] python 특정 문자 사이에 있는 문자 제거 (정규표현식) (0) | 2021.10.21 |