Python Multiprocessing - Pool

oosiz·2021년 4월 6일
1

OS&Network

목록 보기
2/3
post-thumbnail

코드

import multiprocessing
import time
import os

core_cnt = os.cpu_count()

start_time = time.time()

def count(name):
    for i in range(1, 50001):
        print(name, " : ", i)

num_list = ['p1', 'p2', 'p3', 'p4']

if __name__ == '__main__':
    # pool = multiprocessing.Pool(processes=core_cnt)
    # pool.map(count, num_list)
    # pool.close()
    # pool.join()

    with multiprocessing.Pool(core_cnt) as p:
        p.map(count, num_list)

print("--- %s seconds ---" % (time.time() - start_time))

# --- 0.8151099681854248 seconds ---

비교 코드

import time

start_time = time.time()

def count(name):
    for i in range(1, 50001):
        print(name, " : ", i)

num_list = ['p1', 'p2', 'p3', 'p4']
for num in num_list:
    count(num)

print("--- %s seconds ---" % (time.time() - start_time))

# --- 0.8629150390625 seconds ---

결과

|multiprocessing O|multiprocessing X|
|-|-|
|0.8151099681854248 seconds|0.8629150390625 seconds|

설명

multiprocessing.Pool 클래스

#1번째 방법
if name == 'main':
pool = multiprocessing.Pool(processes='사용할 프로세스 개수')
pool.map(함수, iterable)
pool.close()
pool.join()


> ```python
# 2번째 방법
if __name__ == '__main__':
    with multiprocessing.Pool('사용할 프로세스 개수') as p:
        p.map(함수, iterable)

*if name == 'main': 안에서 실행해야 함.


pool 객체 생성

multiprocessing.Pool(processes='사용할 프로세스 개수'


실행할 함수에 iterable 전달
(iterable의 요소들이 함수에 들어감)
*iterable : 반복 가능한 객체(list, dict, set, str, bytes, tuple, range 등)

pool.map(함수, iterable)


리소스 낭비를 방지하기 위해 close 호출

pool.close()


작업 완료 대기 위해 join 호출

pool.join()


현재 로컬 머신의 CPU 수 구하기

core_cnt = os.cpu_count()

profile
A Data engineer as a Learner, a Supporter, and a Listener

0개의 댓글