Python은 GIL(Global Interpreter Lock) 정책으로 인해 기본적으로 스레드를 사용한 병렬 처리가 제한되어 있습니다.
따라서 여러 스레드가 동시에 실행되지 않고 하나의 스레드에서만 실행됩니다. 이러한 제한을 극복하기 위해 Python은 multiprocessing 모듈을 제공합니다. 이를 사용하여 여러 프로세스를 생성하고 각각의 프로세스에서 병렬로 작업을 수행할 수 있습니다.
멀티 프로세싱이란?
멀티프로세싱(Multiprocessing)은 컴퓨터 프로그램이 여러 개의 프로세스를 동시에 실행하여 병렬로 작업을 처리하는 방법을 가리킵니다. 각 프로세스는 독립적인 메모리 공간을 가지며, 각각이 별도의 작업을 수행할 수 있습니다.
이 방법은 다수의 중앙 처리 장치(CPU)를 활용하여 여러 작업을 동시에 처리함으로써 시스템 성능을 향상시키는데 사용되기에 특히 대규모 또는 계산량이 많은 작업을 처리할 때 유용합니다.
예를 들어, 웹 서버에서 동시에 여러 클라이언트 요청을 처리하거나, 데이터베이스에서 복수의 쿼리를 동시에 실행하는 경우에 멀티프로세싱을 사용할 수 있습니다.
Python에서는 multiprocessing 모듈을 사용하여 멀티프로세싱을 구현하여 프로그램에서 여러 프로세스를 생성하고 관리할 수 있습니다. 또한, 멀티프로세싱은 멀티스레딩과는 다르게 GIL(Global Interpreter Lock)에 영향을 받지 않아 여러 CPU 코어를 활용하여 병렬 작업을 처리할 수 있습니다.
주의할 점)
멀티프로세싱은 각각의 프로세스가 독립적으로 실행되기 때문에 프로세스 간에 데이터를 공유하기 위해서는 추가적인 메커니즘이 필요합니다. 이러한 점을 고려하여 프로세스 간 통신(IPC)을 구현해야 합니다.
예제코드) 3개의 프로세스를 이용한 병렬처리 코드
from multiprocessing import Pool
import time
import os
def func(x):
print(f'값 {x} 에 대한 작업 pid={os.getpid()}')
time.sleep(1)
return x*x
if __name__ == '__main__':
startTime = int(time.time())
p = Pool(processes=3) # 3개의 프로세스를 사용하여 병렬 처리
# func 함수를 range(0, 10)의 각 요소에 적용하고 결과를 리스트로 반환
result = p.map(func, range(0, 10))
endTime = int(time.time())
print('총 작업 시간:', (endTime - startTime))
코드 실행결과
값 0 에 대한 작업 pid= 13920
값 1 에 대한 작업 pid= 26068
값 2 에 대한 작업 pid= 28980
값 3 에 대한 작업 pid= 13920
값 4 에 대한 작업 pid= 26068
값 5 에 대한 작업 pid= 28980
값 6 에 대한 작업 pid= 13920
값 7 에 대한 작업 pid= 26068
값 8 에 대한 작업 pid= 28980
값 9 에 대한 작업 pid= 13920
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
총 작업 시간 : 5