Til | 멀티스레드와 멀티프로세싱

타샤's 월드·2025년 7월 4일
0

https://youtu.be/KduRAimE7Xk?si=c5Y5lYJAROxO3-qQ

이거 좀 신기...
라고 생각했는데..
다시 생각해보니까
"이 영상 좀 이상하지 않나? gil에서 말하는 멀티 쓰레드는 하드웨어 스레드 아냐?"
싶어서 다시 스레드랑 프로세스 정리해보기!


멀티스레드랑 멀티프로세싱

멀티스레드 (병렬성)

import threading
import time

def worker(n):
    print(f"Thread {n} 시작")
    time.sleep(2)
    print(f"Thread {n} 종료")

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()
  • 알다시피 파이썬의 하드웨어 단의 쓰레딩은 global interpreter lock이 걸려있어서 어려움.
  • gli가 걸려있는 이유는 cpython의 메모리 관리가 thread-safe 하지 않기 때문
  • 정확히 말하자면 하드웨어 스레드가 4개가 있어도 실제로 동시에 실행되는 파이썬 명령어는 1개만 가능
  • 하지만 파이썬 스레딩을 하면 os 단에서 스케줄링으로 할 수 있다는 의미긴한데.. gli걸려 있는 동안은 실제로 스레드를 동시에 사용 못하니까 사실상 한계가 있음

그런데 I/O-bound 작업은 예외

  • time.sleep(), 파일 읽기, 네트워크 요청 등은 GIL을 자동으로 해제함
  • 이 경우 GIL이 비워져 있어 다른 스레드가 실행 가능함
  • 그래서 멀티스레딩이 I/O-bound 작업에 효과적인 이유

멀티프로세싱 (병렬성)

from multiprocessing import Process
import time

def worker(n):
    print(f"Process {n} 시작")
    time.sleep(2)
    print(f"Process {n} 종료")

processes = []
for i in range(5):
    p = Process(target=worker, args=(i,))
    p.start()
    processes.append(p)

for p in processes:
    p.join()
  • 여러 개의 Python 프로세스를 만들어 각 코어에 분산 실행
  • GIL을 완전히 우회 가능
  • 비용: 프로세스 간 메모리 공유 어려움, 시작 비용 있음
  • 이미지 필터, 수학 연산, 데이터 전처리

asyncio (동시성)

는 알잖아?

profile
그때 그때 꽂힌것 하는 개발블로그

0개의 댓글