스레드 (2) - 멀티 스레드
- GIL (Global Interpreter Lock)
- 멀티 프로세싱 (multi-processing)
- 스레드 vs 프로세스
GIL (Global Interpreter Lock)
- 파이썬에서는 하나의 프로세스 안에 모든 자원의 락(Lock)을 글로벌하게 관리함으로써 하나의 쓰레드만 자원을 컨트롤하여 동작하도록 함
- 아래 그림에서 스레드 하나 실행 시간은 약 0.1초, 두 개 실행 실행시키면 0.2초가 나옴
- GIL 때문, 즉 한번에 하나의 스레드만 실행 시킴
- 두 개의 thread를 사용해서 0.1가 나오기 위해서는 멀티 프로세싱을 사용해야함.
import threading
import time
def thread_func(num):
for i in range(num):
pass
def thread_func1(num):
for i in range(num):
pass
# # multi thread
# start_time = time.time()
# t = threading.Thread(target=thread_func, args=(10000000, ))
# t2 = threading.Thread(target=thread_func1, args=(10000000, ))
# t.start()
# t2.start()
# t.join()
# t2.join()
# end_time = time.time() - start_time
# print(f'elapsed time : {end_time}')
멀티 프로세싱 (multi-processing)
- threading 모듈과 구현방식이 유사
- 단점
- 프로세스는 각자의 고유한 메모리 영역을 가지고 있기 때문에 스레드에 비해 메모리 사용량이 늘어남
- 아래 코드의 경우, 프로세스 1개 실행 시, 0.16초, 2개 실행 시, 0.17초 정도로 동시에 실행되는 것을 확인할 수 있음
import threading
import multiprocessing as mp
import time
def thread_func(num):
for i in range(num):
pass
def thread_func1(num):
for i in range(num):
pass
if __name__ == '__main__':
start_time = time.time()
# multi processing
m1 = mp.Process(target=thread_func, args=(10000000, ))
m2 = mp.Process(target=thread_func1, args=(10000000, ))
m1.start()
m2.start()
m1.join()
m2.join()
end_time = time.time() - start_time
print(f'elapsed time : {end_time}')
스레드 vs 프로세스
- 파이썬에서 병렬처리를 구현하는 방식은 멀티스레드 or 멀티프로세스 방식이 있음
- 스레드의 경우,
- GIL로 계산 처리 작업은 하나의 스레드에서만 작동하여 CPU 작업이 적고, I/O 작업이 많은 병렬처리에 효과적
- 프로세스의 경우,
- 각자가 고유한 메모리 영역을 가지므로 메모리 사용이 많음
- 각각의 프로세스에서 병렬로 cpu 작업을 할 수 있어 여러 머신에서 동작하는 분산 처리 프로그램 구현이 가능함
Reference
Nathan's Blog
The blog to learn more.
monkey3199.github.io
'Python' 카테고리의 다른 글
[ Python ] 콜백함수, lambda, map, filter 함수 (0) | 2023.01.02 |
---|---|
[ Thread ] 스레드 (3) - Lock() (0) | 2022.12.16 |
[ Thread ] 스레드 (1) (0) | 2022.12.14 |
[Socket] 소켓(Socket) 프로그래밍 (1) (1) | 2022.09.21 |
[Python] enumerate 함수 (0) | 2022.01.26 |