소개

프로그램을 만들다 보면 네트워킹 작업이나 파일시스템 관련 I/O 작업등과 같이 synchronous 하게 작업하지 않아도 되는 로직들이 많이 생기게 됩니다. 프로그램 성능 향상을 위해서는 이러한 작업들은 식별하여 병렬 처리를 하도록 로직 처리를 하는 것이 좋은 방법이 될 수 있어요.

Python 에서는 이러한 병렬 처리를 위해서 threading 과 multiprocessing 을 지원하고 있습니다.

각각은 무엇이고, 어떻게 동작을 하는 것일까요?그리고 어떤 차이점이 있는지, 어떤 상황에서 어떤 방법을 사용하는 것이 더 효율적일까요?

이러한 궁금증에 대하여 정리해보려 합니다.

Threading

스레드 기반의 병렬 처리를 지원하는 모듈입니다. 스레드라 하면 프로세스 내에서 실행되는 흐름의 단위를 의미한다고 wiki 에서 나오는데요. 보통 하나의  프로세스는 하나 이상의 스레드를 가지고 있습니다. 랩탑을 통해서도 간단히 확인이 가능한데요. 맥북일 경우 아래와 같이 ‘활성 상태 보기’ 를 통해 한 프로세스에 여러 스레드가 실행되고 있는 것을 볼 수 있어요.

threading

한 프로세스에서 여러 스레드를 이용하여 병렬 처리를 하는 것을 멀티스레딩 방법이고 볼 수 있는데요.

python 에서는 멀티스레딩 동작 방식이, GIL(Global Interpreter Lock) 로 인해서 실제로 동시에 실행 되는 것이 아닌, 동시에 수행되는 것처럼(!) 동작을 하게 됩니다. GIL 이라함은 쉽게 말해 여러 스레드가 있어도 CPU 자원을 사용할 수 있는 스레드는 하나만 허용한다는 의미인데요. 그로인해 python 에서는 아래 그림과 같이 각각의 스레드를 이용해 function 을 병렬 처리 하도록 구현하더라도 실질적으로 동시에 실행 처리되는 것이 아니라, function 각각이 차례대로 CPU 자원을 점유하여 실행 처리 되게 됩니다.

보다 더 많은 스레드가 존재한다면 각각의 스레드들이 빠르게 전환되면서 CPU 자원을 사용하면서 동시에 실행되는 것처럼(!) 실행이 되는 것이죠. 이러한 특징 때문에 CPU 사용이 많은 작업에는 적합하지 않습니다.

threading

Multiprocessing

멀티프로세싱은 프로세스를 여러개 두어 병렬 처리를 하는 방법입니다. 아래 그림을 통해서 threading 방식과의 차이점을 확인해볼 수 있을 것 같아요. 프로세스를 여러개 두어 처리를 하기 때문에 CPU 사용이 많은 작업에서 threading 보다 더 효율적으로 동작을 합니다.

multiprocessing

Threading vs Multiprocessing

그렇다면, python 에서 threading 방식과 multiprocessing 방식 중 어떤 것을 사용하는 것이 더 효율적인가? 생각해볼 수 있습니다.

위에서 각각의 동작 방식 때문에 아래와 같이 정리를 할 수 있을 것 같아요.

ThreadingMultiprocessing
I/O BoundCPU Bound
Network(http, downloa, etc..)
File System(file read/wirte, etc..)
Calcucalculator
Image Processing

More Reading

참고

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Back To Top