파이썬 성능을 높이고 싶을 때 알아야 할 것
❓ 파이썬 환경에서 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