스레드 (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

+ Recent posts