개요
멀티프로세스는 다수의 프로세스가 개별적인 메모리 공간과 스택, 프로그램 카운트를 가지며 실행되는 상태이며, 멀티스레드는 프로세스 내에서 여러개의 작업단위가 메모리를 공유하며 작동하는 방식이다. 일반적으로 메모리를 공유하는 멀티스레딩의 구현이 어렵다.
GIL(Global Interpreter Lock)
Python에서는 리소스를 보호하기 위해 하나의 프로세스 안의 모든 자원을 하나의 Thread만 사용할 수 있도록 제한한다. Thread끼리 자원을 공유하며 실행될 때 하나의 자원을 여러 스레드가 점유하는 상황을 피하기 위함이다. GIL은 Garbage collection 구현이 수월해지지만 멀티스레드의 이점을 쉽게 구현하기 힘들다. 즉, 스레드 단위에서의 병렬성 연산이 불가능하여 단일 스레드로 처리하나, 멀티스레드로 처리하나 멀티스레딩 구현으로 인한 오버헤드가 커질 뿐, 처리 속도의 차이가 없다. 다만, Filesystem이나 Network 통신 등의 I/O wait 동안에는 CPU 작업을 수행할 수 있으므로 이때 Python의 멀티스레딩 구현은 이점이 있다.
Multiprocessing
그래서 일반적으로 Python으로는 멀티프로세싱을 구현하며, 멀티스레딩으로는 불가능했던 CPU의 멀티코어 또한 활용 가능하다. 프로세스의 특징 상 하나의 주 스레드를 가지며, 독립된 메모리 영역을 가지기 때문에 메모리 소비량이 커지지만 분산 처리 구현도 비교적 수월하게 가능하다.
프로세스 간의 데이터 교환은 multiprocessing.Queue, multiprocessing.Pipe 객체를 활용하여 구현한다.