본문 바로가기

python

thread - pull, 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

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()