728x90
[Python] multiprocessing
파이썬의 multiprocessing 라이브러리는 병렬 처리를 통해 CPU 성능을 극대화할 수 있도록 해준다.
멀티프로세싱의 필요성
파이썬은 기본적으로 GIL(Global Interpreter Lock)이라는 매커니즘 때문에,
하나의 프로세스 내에서 동시에 여러 스레드를 실행하는 데에 제한이 있다.
이를 해결하기 위해 멀티프로세싱을 사용하면, 여러 개의 프로세스를 생성하여 병렬로 작업을 수행할 수 있다.
멀티프로세싱 기본 개념
multiprocessing 라이브러리는 여러 프로세스를 생성하고 관리하는데 유용한 도구를 제공한다.
주요 개념은 다음과 같다.
Process | 독립적인 프로세스 |
Queue | 프로세스 간 데이터를 교환할 수 있는 FIFO 구조 |
Pool | 프로세스 풀을 생성하여 작업을 병렬로 실행 |
예를 들어 숫자 리스트의 각 원소를 제곱하는 작업을 병렬로 수행해보자.
import multiprocessing as mp
def square_nums(nums, queue):
for num in nums:
queue.put(num * num)
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5]
queue = mp.Queue()
# 두 개의 프로세스 생성
p1 = mp.Process(target=square_nums, args=(nums[:3], queue))
p2 = mp.Process(target=square_nums, args=(nums[3:], queue))
# 프로세스 시작
p1.start()
p2.start()
# 프로세스가 종료될 때까지 대기
p1.join()
p2.join()
# 결과 출력
while not queue.empty():
print(queue.get())
멀티프로세싱 풀을 이용한 작업 분배
멀티프로세싱 풀을 사용하면 더 쉽게 병렬 작업을 분배할 수 있다.
다음은 Pool을 사용하여 병렬 작업을 분배한 예제다.
import multiprocessing as mp
def square_nums(num):
return num * num
if __name__ == '__main__':
nums = [1, 2, 3, 4, 5]
with mp.Pool(processes=2) as pool:
results = pool.map(square_nums, nums)
print(results)
## 출력 결과
[1, 4, 9, 6, 25]
Pool 객체를 생성하여 두 개의 프로세스를 사용해 숫자 리스트의 제곱을 계산한다.
map 메서드는 리스트의 각 원소에 대해 square_num 함수를 병렬로 적용한다.
추가로 cpu_count() 함수를 사용하면, 현재 서버의 cpu의 개수를 확인 할 수 있다.
cpu의 개수에 맞춰 pool의 개수를 조정하는 등의 방법을 사용할 수 있다.
print(mp.cpu_count())
## 출력 결과
16
반응형
'👩💻 Develope > Python' 카테고리의 다른 글
[Pandas] 데이터프레임에서 날짜와 시간 다루기 (0) | 2024.08.09 |
---|---|
[Python] 파일 날짜 가져오기 (0) | 2024.08.08 |
[Python] __init__(), __new__() (0) | 2024.07.31 |
[Python] 주피터 노트북 서버 설정하기 (0) | 2024.07.11 |
[Python] 리눅스에 Pyenv 가상환경 설치 (0) | 2024.07.08 |