파이썬을 이용하며, 속도를 개선하기 위한 방법으로 병렬처리를 할 수 있습니다.
병렬처리는 여러 개의 CPU 코어를 사용하여 동시에 작업을 처리하는 방법입니다.
1. Pool
import multiprocessing
def calculate(a, b, c):
return a * b + c
if __name__ == '__main__':
# 입력 값 리스트 생성
input_list = [(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]
# 프로세스 풀 생성
pool = multiprocessing.Pool(processes=4)
# 병렬 처리를 위한 map 메서드 호출
output_list = pool.starmap(calculate, input_list)
# 프로세스 풀 종료
pool.close()
pool.join()
print(output_list)
# [5, 26, 65, 143]
간단하죠?
if __name__ == '__main__':
이것은 해당 파일이 메인 프로그램으로서 실행되는지 확인하기 위해 사용됩니다.
부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 부모 프로세스로부터 생성되어 실행됩니다.
부모 프로세스와 자식 프로세스 간의 메모리 공간이 분리되어야 함을 보장하기 위해 사용됩니다.
if __name__ == '__main__': 구문이 없다면 자식 프로세스가 multiprocessing을 실행할 때마다 새로운 자식 프로세스가 생성될 것이고, 이는 무한한 자식 프로세스 생성을 유발할 수 있습니다.
2. Process
import multiprocessing
def square(n):
print(f"square({n}) = {n**2}")
def cube(n):
print(f"cube({n}) = {n**3}")
if __name__ == '__main__':
# 자식 프로세스로 실행할 함수와 인자를 리스트로 정의
jobs = [(square, 2), (cube, 3), (square, 4), (cube, 5)]
# 자식 프로세스 생성 및 실행
processes = []
for job in jobs:
p = multiprocessing.Process(target=job[0], args=(job[1],))
processes.append(p)
p.start()
# 자식 프로세스가 실행을 완료할 때까지 대기
for p in processes:
p.join()
멀티프로세싱은 Pool과 Process 클래스를 제공합니다. 그러나, Pool과 Process는 사용 목적이 다릅니다.
Pool은 사전에 지정한 개수만큼 프로세스를 생성하여 이들을 pool에 담아두고, 작업이 있을 때마다 이 pool에서 프로세스를 꺼내 작업을 처리합니다.
반면, Process는 개별 프로세스를 생성하여 각각의 프로세스에서 작업을 처리합니다.
Pool은 CPU 바운드 작업에 적합, Process는 I/O 바운드 작업에 적합합니다.
(CPU 바운드: CPU 성능에 따라 속도가 결정되는 작업. 예) 계산 작업)
(I/O 바운드 작업: input과 ouput 즉, 파일 입출력, 네트워크 통신, 데이터베이스 퀄 등 작업)
Pool은 작업을 넣어주면 알아서 분산 처리를 하고, Process는 각 프로세스에 명시적으로 작업을 설정해야 합니다.
3. return 값 가져오기
from multiprocessing import Process, Manager
class MyProcess(Process):
def __init__(self, num, result_dict):
super().__init__()
self.num = num
self.result_dict = result_dict
def run(self):
print("Process {} is started".format(self.num))
# 멀티프로세싱에서 실행할 코드 작성
self.result_dict[self.num] = self.num
print("Process {} is finished".format(self.num))
if __name__ == '__main__':
manager = Manager()
result_dict = manager.dict()
process_list = []
for i in range(5):
process_list.append(MyProcess(i, result_dict))
for process in process_list:
process.start()
for process in process_list:
process.join()
for i in range(len(process_list)):
print(result_dict[i])
클래스 형식으로 간단한 예제를 만들었습니다.
리턴 값을 Manager에 저장하여 가져옵니다.
4. threading 모듈
https://sjblog1.tistory.com/75
'컴퓨터 > Python' 카테고리의 다른 글
[Python] 파이썬, 서울시 버스도착정보 공공데이터 (0) | 2023.04.17 |
---|---|
[Python] 파이썬, threading 간단 예제 (0) | 2023.03.27 |
[Python] 파이썬, A value is trying to be set on a copy of a slice from a DataFrame 경고 (0) | 2023.03.26 |
[Python] 파이썬, sqlite3 사용하기 (0) | 2023.03.23 |
[Python] 파이썬, 아나콘다 명령어 모음 (0) | 2023.03.08 |