파이썬 - 멀티 프로세스(Pool, Process)와 멀티 스레드 비교

서수·2024년 2월 25일
1

Python

목록 보기
1/1

본 글은 혼자 공부하려고 기록해 두는 메모장

파이썬은 기본적으로 싱글 스레드에서 순차적으로 동작하기에 병렬처리를 위해선 별도의 모듈을 사용해서 수행하여야 한다.

그렇다면 어떠한 방법들이 있을까?

바로 Pool 또는 Process를 multiprocessing 에서 불러와서 처리하는 방법이 있다.

Pool

Pool 을 사용하여 멀티 프로세싱을 하는 것은 주로 CPU 바운드 작업 또는 I/O 바운드 작업병렬로 처리할 때 주로 사용된다.

작업을 여러개의 작은 작업으로 분할하고 이를 병렬로 실행하여 전체 작업을 더 효율적으로 처리하게 하는데 도움이 됩니다.

그렇다면 Process 는?

Process

Process를 생성하고 사용하는건 주로 CPU를 많이 사용하는 작업, 즉 CPU 바운드 작업을 사용할 때 유용하고,

병렬 처리를 하여 독립적으로 메모리 공간을 가지므로, 작업간의 간섭이 없고 독립적이게 실행하게 할 수 있다.

설명을 보니 공통적으로 CPU 바운드 작업에서 많이 쓰나보다. 근데 CPU 바운드? I/O 바운드가 뭐지...?

CPU 바운드

짧게 말해 CPU 바운드 작업은 CPU 작업을 많이 사용하는 작업을 말한다. 예를 들면 복잡한 계산이나 데이터의 처리, 이미지를 처리한다거나 암호화 등 이러한 작업들이 이에 해당한다.
CPU 바운드 작업을 병렬로 처리한다면 전체 실행 시간을 줄일 수 있는것.

I/O 바운드

I/O 바운드 작업은 주로 파일의 입출력 (input / output) 네트워크의 통신이나 DB 접근 등 입출력 작업을 주로 이루고 있는 작업들을 말한다. 이러한 작업들은 CPU 자원들을 그렇게 크게 사용하지는 않지만 대기시간이 발생하는 경우가 많다.
I/O 바운드 작업을 병렬로 처리한다면 대기 시간을 최소화하고 전체 실행 시간을 단축할 수 있는것.

아니 그럼 둘다 CPU 바운드 작업때 하는건데 둘의 차이가 대체 뭐임?

Pool 과 Process 의 차이

Pool 과 Process 는 모두 병렬 처리를 위해 사용되지만 가장 큰 차이점은 Pool 은 처리할 일 전체를 뿌려놓고 알아서 병렬 처리를 하게 만드는 것이고, Process 는 각 프로세스 별로 할당량을 명시적으로 적어 그걸 처리하게 하는 것이다.

Pool 처리 예시

from muitiprocessing import Pool

def f(x):
	return x*x
    
if __name__ == '__main__':
    p = Pool(4)
    result = p.map(f,[1,2,3,4])
    p.close()
    print(result)

Process 처리 예시

from multiprocessing import Process
def f(x)
	print(x*x)
   
print(__name__)
if __name__ == '__main__':
	numbers = [1,2,3,4]
    proc1 = Process(target = f, args=(numbers[0]))
    proc1.start()
    proc2 = Process(target = f, args=(numbers[1]))
    proc2.start()
    proc3 = Process(target = f, args=(numbers[2]))
    proc3.start()
    proc4 = Process(target = f, args=(numbers[3]))
    proc4.start()
    proc1.join()
    proc2.join()
    proc3.join()
    proc4.join()

위에 보듯이 Pool 은 명시를 해준것이 없이 흩뿌린 것이고, 아래는 Process는 하나하나 args로 명시를 해준 것.
대부분은 Pool 을 사용하여 멀티 코어 시스템에서 CPU를 효율적으로 활용 할 수 있다고 한다.

Multi Process VS Multi Thread

Process가 나왔다면 thread 가 딸려 올 수밖에 없다.

멀티 스레드는 파이썬의 threading 모듈을 사용하여 병렬로 처리 할 수 있는데 Multi Process 와 Multi thread의 차이점을 비교해 보려 한다.

멀티 프로세스와 멀티 스레드는 동시에 여러 작업을 처리하는 방식이지만 구현과 동작방식에서 중요한 차이점을 가지고 있다.

Process vs Thread

  • 멀티 프로세스 : 각각의 프로세스는 운영체제로부터 독립된 메모리 공간을 할당받고, 각각이 별도의 주소 공간을 가지고 실행된다. 프로세스 간 데이터 공유가 별도의 메커니즘을 통해 이루어져야 한다.

  • 멀티 스레드 : 스레드는 하나의 프로세스 내에서 실행되는 여러 실행의 흐름으로, 같은 프로세스 내의 스레드들은 같은 주소 공간을 공유한다. 따라서 데이터 공유가 더욱 간단하고 빠르다.

자원 소비

  • 멀티 프로세스 : 각 프로세스는 독립된 메모리 공간을 가지므로, 메모리 소비가 더 많을 수 있다. 또한 프로세스간 전환 시 운영체제에 의한 오버헤드가 있다. 오버헤드란 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리 등을 말한다.

  • 멀티 스레드 : 스레드는 같은 주소 공간을 공유하므로, 메모리 소비가 작고 프로세스 간 전환시 오버헤드가 적다.

동기화

  • 멀티 프로세스 : 프로세스 간 통신(IPC)을 통해 데이터를 주고 받아야 하며, 데이터 공유와 동기화가 별도의 메커니즘을 사용하여야 한다. 프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다. 프로세스 간 네트워크 통신을 통해 인터넷 상의 수많은 개인용 컴퓨터를 연결하는 그리드 컴퓨팅 시스템을 보여주는 예.

  • 멀티 스레드 : 스레드는 같은 주소공간을 공유하므로, 데이터 공유와 동기화가 더욱 간단하다. 그러나 이걸로 인해 동기화 문제가 발생할 수 있으니 주의해야한다.

안전성

  • 멀티 프로세스 : 각 프로세스는 독립적인 메모리 공간을 가지므로, 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스에는 영향을 미치지 않는다.

  • 멀티 스레드 : 스레드는 같은 주소 공간을 공유하므로, 하나의 스레드가 비정상적으로 종료되거나 동작하면 다른 스레드에도 영향을 미칠 수가 있다.

결론

프로세스 간 통신이 필요하거나 안전성이 중요한 경우에는 멀티 프로세스를 사용하고 데이터 공유와 성능 향상이 중요한 경우에는 멀티 스레드를 사용하는 것이 좋다.

profile
패션디자인과 출신 비전공자가 개발자로 성장하려 만든 노트

0개의 댓글