직렬 처리
# GIL 정책에 의해 완전한 thread 구현은 불가능하다.
# 그래서 multiprocessing 모듈로 GIL 우회하여 병렬처리가 가능하도록 하고 있다.
from multiprocessing import Pool, Process
import time
import os
# Pool : 입력 값에 대해 process들을 건너건너 분해하여 함수 실행을 병렬처리
def func(x):
print('값 ', x, '에 대한 작업 process id : ', os.getpid())
time.sleep(1)
return x * x
if __name__ == '__main__':
startTime =int(time.time())
for i in range(0, 10):
print(func(i))
endTime = int(time.time())
print('총 작업 시간 : ', (endTime - startTime))
값 0 에 대한 작업 process id : 6776
0
값 1 에 대한 작업 process id : 6776
1
값 2 에 대한 작업 process id : 6776
4
값 3 에 대한 작업 process id : 6776
9
값 4 에 대한 작업 process id : 6776
16
값 5 에 대한 작업 process id : 6776
25
값 6 에 대한 작업 process id : 6776
36
값 7 에 대한 작업 process id : 6776
49
값 8 에 대한 작업 process id : 6776
64
값 9 에 대한 작업 process id : 6776
81
총 작업 시간 : 10
pool을 활용한 병렬처리
process를 포함한 다른 것들보다 pool을 더 자주 사용한다
속도는 더 빨리질 수 있어도 자원소모가 심해진다. 따라서 사용하되 남용하는건 좋지 않다.
# GIL 정책에 의해 완전한 thread 구현은 불가능하다.
# 그래서 multiprocessing 모듈로 GIL 우회하여 병렬처리가 가능하도록 하고 있다.
from multiprocessing import Pool, Process
import time
import os
# Pool : 입력 값에 대해 process들을 건너건너 분해하여 함수 실행을 병렬처리
def func(x):
print('값 ', x, '에 대한 작업 process id : ', os.getpid())
time.sleep(1)
return x * x
if __name__ == '__main__':
startTime =int(time.time())
""" 직렬처리
for i in range(0, 10):
print(func(i))
"""
# 병렬처리
p = Pool(processes=3) # processes를 늘린다. (3 ~ 5개가 적당하다)
print(p.map(func, range(0, 10)))
endTime = int(time.time())
print('총 작업 시간 : ', (endTime - startTime))
값 0 에 대한 작업 process id : 17084
값 1 에 대한 작업 process id : 1796
값 2 에 대한 작업 process id : 19252
값 3 에 대한 작업 process id : 17084
값 4 에 대한 작업 process id : 1796
값 5 에 대한 작업 process id : 19252
값 6 에 대한 작업 process id : 17084
값 7 에 대한 작업 process id : 1796
값 8 에 대한 작업 process id : 19252
값 9 에 대한 작업 process id : 17084
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
총 작업 시간 : 4
Process를 활용한 처리
# GIL 정책에 의해 완전한 thread 구현은 불가능하다.
# 그래서 multiprocessing 모듈로 GIL 우회하여 병렬처리가 가능하도록 하고 있다.
from multiprocessing import Pool, Process
import time
import os
# Pool : 입력 값에 대해 process들을 건너건너 분해하여 함수 실행을 병렬처리
def func(x):
print('값 ', x, '에 대한 작업 process id : ', os.getpid())
time.sleep(1)
return x * x
print('\n-----process------')
def func2():
print('연속적으로 어떤 작업을 진행')
time.sleep(1)
def doubler(num):
result = num + 10
func2()
proc = os.getpid()
print('num : {0}, result : {1}, process id : {2}'.format(num, result, proc))
if __name__ == '__main__':
startTime =int(time.time())
""" 직렬처리
for i in range(0, 10):
print(func(i))
"""
# 병렬처리
p = Pool(processes=3) # processes를 늘린다. (3 ~ 5개가 적당하다)
print(p.map(func, range(0, 10)))
endTime = int(time.time())
print('총 작업 시간 : ', (endTime - startTime))
print('----------')
numbers = [1,2,3,4,5]
procs = []
for idx, number in enumerate(numbers):
proc = Process(target=doubler, args=(number, ))
procs.append(proc) # process에 join()을 추가할 의도
proc.start()
for proc in procs:
proc.join()
'python' 카테고리의 다른 글
웹 서버 구축 - SimpleHTTPRequestHandler (0) | 2022.10.14 |
---|---|
웹 크롤링 - 미완성 (1) | 2022.10.13 |
socket, thread - 채팅 서버와 클라이언트 (0) | 2022.10.13 |
thread - lock (빵 공장 예제) (0) | 2022.10.13 |
thread - 동기화(줄서기),lock을 활용한 전역변수 충돌 해결 (0) | 2022.10.13 |