Multiprocessing(멀티 프로세싱)
멀티 프로세싱을 활용하면 여러 작업을 별도의 프로세스를 생성 후 병렬처리해서 더 빠르게 결과를 얻을 수 있다.
멀티 프로세싱을 잘 활용하면 멀티코어의 CPU 장점을 잘 살릴 수 있지만,
병렬 프로그래밍의 이해 없이 코드를 작성하면 싱글 프로세스보다 더 느린 경우나,
예상하지 못한 결과가 나올 수 있으니 프로세스, 쓰레드에 대한 이해가 필요하다.
* 멀티 프로세싱은 메모리 사용률이 높아지는 단점이 있다.
방법 1: Process 객체를 이용한 방법
import os
from multiprocessing import Process
# 실행할 함수
def f(name):
print(f"Hello, {name}")
if __name__ == "__main__":
processes = [] # 프로세스 리스트 생성
# 프로세스 객체 생성 및 시작
for i in range(5):
p = Process(target=f, args=(f"proc_{i}",))
processes.append(p)
p.start()
# 모든 프로세스가 종료될 때까지 대기
for p in processes:
p.join()
print("All processes have finished.")
-> 함수 f에 인자 proc_0, proc_1, ... 을 넣어 프로세스 객체 생성
-> start() 메서드로 실행하고 join()메서드가 프로세스가 종료될 때까지 대기(블록킹 함수)
방법 2: Pool 객체를 이용한 방법
from multiprocessing import Pool
import time
# 실행할 함수
def count(name):
for i in range(5):
print(f"{name}: {i}")
time.sleep(1)
if __name__ == "__main__":
start_time = time.time()
# Pool 객체 생성
p_list = ["proc_1", "proc_2", "proc_3", "proc_4"]
pool = Pool(processes=4)
# 병렬 처리
pool.map(count, p_list)
# Pool 닫기
pool.close()
# 모든 작업이 완료될 때까지 대기
pool.join()
multiprocessing.Pool 클래스에 사용되는 함수로는 map(), imap(), starmap()이 있다.
- map() 함수
- 모든 작업을 한 번에 Pool에 넘겨서 병렬 처리를 하고, 작업이 완료된 후에 결과를 순서대로 반환합니다.
- 각 작업에는 하나의 인자만 전달할 수 있습니다.
- imap() 함수
- 작업을 하나씩 실행하고, 작업 결과가 사용 가능한 순서대로 반환됩니다.
- imap()은 map() 함수와 달리 작업이 완료될 때까지 기다리지 않고, 사용 가능한 결과가 있으면 바로 반환합니다.
- 각 작업에는 하나의 인자만 전달할 수 있습니다.
- starmap() 함수
- starmap() 함수는 map() 함수와 유사하지만, 각 작업에 여러 개의 인자를 전달할 수 있습니다.
- 각 작업에 튜플로 묶인 인자를 전달하여 병렬 처리를 합니다.