ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개념 정리] Multi Threading, Multi Processing 차이점
    django 2022. 2. 12. 02:09

     

     

    오늘 아침에 있었던 기술 면접에서 django의 multi-threading에 관한 질문이 있었는데, 구체적이지는 못해도 간략하게라도 대답을 못한 게 아쉬워서 간단하게 개념을 정리해보고자 한다.


    # Multi-Threading, Multi-Processing 이란?

     : 파이썬은 기본적으로 싱글 쓰레드에서 순차적으로 동작한다. 따라서 병렬 처리를 하기 위해서는 threading이나 multiprocessing과 같은 별도의 모듈을 사용하여 구현해야 한다. process란 CPU 하나에서 진행되는 작업이며 thread는 process내에서 실제로 작업을 수행하는 주체이다. 하나의 process 는 여러 개의 thread를 가질 수 있다. 한 process의 thread들은 서로 메모리를 공유하며, process는 독립적인 메모리를 가진다.

    한 process 가 여러 thread 를 실행하는 것 (Multi Threading)을 Concurrent execution 이라 하고, 여러 process를 동시에 실행시키는 것 (Multi Processing)을 Parallel execution 이라 한다.

     

    # Multi-Threading vs Multi-Processing

     : 그렇다면 병렬 처리를 하고 싶을 때 둘 중에 무엇을 사용해야 할까? 결론부터 말하자면 multithreading 은 I/O 작업이 많은 task에서 써야 하고, multiprocessing 은 CPU 작업이 많은 task에서 써야 한다. 그 이유는 python 에선 multithreading 동작 방식이, GIL (Global Interpreter Lock) 로 인해서 실제로 동시에 실행되는 것이 아닌, 동시에 수행되는 것처럼 동작을 하게 된다고 한다. GIL은 쉽게 말해 여러 thread가 있어도 CPU 자원을 사용할 수 있는 thread는 하나만 허용한다는 의미이다. 따라서 하나의 thread에서 100의 작업을 실행하는 것과, 두 개의 thread에서 각각 50의 작업을 실행하는 것의 속도차이가 나지 않는다는 뜻이다. 이 때문에 multithreading은 CPU 사용이 많은 작업에는 적합하지 않지만, GIL이 적용되는 것은 CPU 동작에서 이고 thread가 CPU 동작을 마치고 I/O 작업을 실행하는 동안에는 다른 thread가 CPU 동작을 동시에 실행할 수 있기 때문에, CPU 동작이 많지 않고 I/O동작이 더 많은 프로그램에서는 multithreading만으로 성능적으로 큰 효과를 얻을 수 있다.

     

    상황을 예로 들자면,

    - CPU 를 많이 잡아먹지는 않는데 읽고 쓰는 작업 (I/O)이 많은 복수 작업들을 실행하고 싶을 때

    (ex. http, download, file read/wirte, etc..)

    ▶ multithreading

    (읽은 파일들의 데이터를 모두 모아 작업하는 경우 메모리를 공유하는 multithreading이 더욱 유리) 

     

    - CPU 를 많이 잡아먹는, 계산량이 많은 복수 작업들을 실행하고 싶을 때

    (ex. Image Processing, Calculator, etc...)

    ▶ mutliprocessing

     

    # 사용법

     : 병렬 처리를 할 수 있는 파이썬 모듈은 아래와 같다.

    1. concurrent.features 모듈의 ProcessPoolExcutor, ThreadPoolExcutor
    2. threading 모듈
    3. multiprocessing 모듈

    자세한 사용법은 추후에 다뤄보도록 하겠다.


    # django에서의 multi-processing, multi-threading?

     : 장고는 기본적으로 single-thread로 동작하며, 장고에 multi-processing, multi-threading을 가능하게 하는 것이 바로 Gunicorn이나 uWSGI와 같은 WSGI (Web Server Gateway Interface)이다. WSGI를 통해 장고는 클라이언트 요청이 많아도 효율적으로 처리할 수 있다.


    참고

    https://monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html

    https://hhj6212.github.io/programming/python/2021/04/18/python-multi.html

    https://yeonfamily.tistory.com/3

Designed by Tistory.