TIL

파이썬 성능을 높이고 싶을 때 알아야 할 것

친환경사과 2023. 4. 6. 21:16

❓ 파이썬 환경에서 Multi Thread, Multi Processing의 차이점 그리고 성능을 높이고 싶다면?

파이썬에서 멀티 스레드와 멀티 프로세스는 동시에 여러 작업을 수행하는 방식이지만, 그 구현 방식에 차이가 있습니다.

 

• 멀티 스레드는 한 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 방식입니다. 각 스레드는 공유된 메모리에 접근하여 작업을 수행합니다. 이로 인해 스레드 간의 통신이 빠르고 간단하며, 메모리를 공유하기 때문에 메모리 사용량이 적습니다.

 

 하지만, 공유 메모리에 대한 동시성 제어가 필요하며, 이를 관리하는데 복잡한 코드가 필요할 수 있습니다. 또한, Global Interpreter Lock 제약 조건이 있어 하나의 스레드만 파이썬 인터프리터 내에서 실행될 수 있습니다.

 

 반면에 멀티 프로세스는 여러 개의 프로세스가 동시에 실행되는 방식입니다. 각 프로세스는 독립된 메모리 공간을 가지고 있으며, 각각의 프로세스는 별도의 인터프리터를 사용합니다. 이로 인해 멀티 스레드보다 더 많은 메모리를 사용하며, 프로세스 간의 통신이 느리고 복잡합니다.

 

• 하지만, 프로세스는 독립적으로 실행되기 때문에 GIL에 대한 제약이 없습니다. 또한, 프로세스 간의 자원 공유가 필요하지 않은 경우에는 별도의 동기화 코드가 필요하지 않습니다.

 

🍏 따라서, 멀티 스레드는 작업이 I/O 바운드일 때 주로 사용되고, 멀티 프로세스는 CPU 바운드 작업일 때 주로 사용됩니다.

 

🌊 Deep Dive 🌊

멀티 스레드는 작업이 I/O 바운드일 때 주로 사용되고, 멀티 프로세스는 CPU 바운드 작업일 때 주로 사용됩니다.

 

• I/O 바운드 작업은 주로 입출력 작업이 많은 작업을 의미합니다. 이러한 작업은 CPU 자원보다는 디스크나 네트워크 자원 등의 I/O 자원을 많이 사용하는 작업입니다. 예를 들어, 파일 입출력, 네트워크 통신, 데이터베이스 조회 등이 I/O 바운드 작업의 예입니다.

 

• 이와 반대로, CPU 바운드 작업은 주로 CPU 자원이 많이 사용되는 작업을 의미합니다. 이러한 작업은 대부분 계산 작업이 많이 포함되어 있으며, CPU가 많이 사용됩니다. 예를 들어, 대규모 데이터 처리, 암호화/복호화, 이미지/영상 처리 등이 CPU 바운드 작업의 예입니다.

 

❓ 바운드 작업이란 무엇인가요?

• 바운드 작업은 CPU 시간보다는 I/O 작업에 더 많은 시간이 소요되는 작업을 말합니다. I/O 작업이란, 디스크에서 파일을 읽거나 쓰는 것, 네트워크를 통해 데이터를 전송하는 것, 사용자 입력을 받는 것 등을 의미합니다.

 

• 예를 들어, 파일을 읽어서 처리하고 다시 저장하는 작업은 CPU가 아니라 디스크 I/O에 의해 성능이 결정됩니다. 이러한 작업을 "I/O 바운드 작업"이라고 합니다.

 

• 반면, CPU에 의존하는 작업은 "CPU 바운드 작업"이라고 합니다. 예를 들어, 큰 배열을 정렬하거나 복잡한 수식을 계산하는 작업은 CPU에 의존하므로, CPU 바운드 작업에 해당됩니다.

 

❓ 멀티 프로세스에선 독립된 메모리 공간을 가지고 있으며, 각각의 프로세스는 별도의 인터프리터를 사용한다고 이야기 되어 있는데 서로 공유가 필요할 땐 어떤 방식으로 공유하나요?

• 파이썬의 멀티 프로세스는 각각 독립된 메모리 공간을 가지기 때문에, 서로 공유하는 자원이 없습니다. 즉, 한 프로세스가 사용하는 변수나 객체 등은 다른 프로세스에서 직접적으로 접근할 수 없습니다.

 

• 따라서 멀티 프로세스 간 데이터를 주고받기 위해서는 프로세스 간 통신(IPC, Inter-Process Communication) 기술을 사용해야 합니다. 예를 들어, 파이썬에서는 multiprocessing 모듈에서 제공하는 Queue, Pipe, Value, Array 등의 객체를 이용하여 프로세스 간 통신을 할 수 있습니다.

 

• 또한, 프로세스 간 공유 메모리를 사용하는 multiprocessing 모듈의 Shared Memory, Manager 객체를 이용하여, 여러 프로세스가 공유하는 메모리를 사용할 수 있습니다. 이러한 공유 메모리는 여러 프로세스에서 동시에 접근 가능하므로, 프로세스 간의 데이터 공유에 용이합니다. 하지만, 동시에 여러 프로세스가 같은 자원에 접근할 때 발생할 수 있는 경쟁 조건(Race Condition) 등에 대한 주의가 필요합니다.


📚 참고 자료

Python_MultiProcessing_Introduce

 

Python Multiprocessing Pool: The Complete Guide

The Python Multiprocessing Pool class allows you to create and manage process pools in Python. Although the Multiprocessing Pool has been available in Python for a long time, it is not widely used,…

superfastpython.com