[ Python ] multiprocessing / concurrent.futures

2019. 8. 18. 19:23분석 Python/구현 및 자료

728x90

멀티프로세싱 공부

 

Queues 

FIFO(선입선출) 먼저 들어온 놈이 먼저 나간다라고 한다.

안에서 쌓아놨다고 내뱉는 머 그런 느낌!

순서가 중요할 때 안전하게 사용해야 하는 느낌이다.

from multiprocessing import Process, Queue
import random

def rand_num(queue , x):
    #num = random.random()
    queue.put(x)

if __name__ == "__main__":
    
    processes = [Process(target=rand_num, args=(queue,x,)) for x in range(10)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    results = [queue.get() for p in processes]
    print(results)

concurrent.futures ProcessPoolExecutor / ThreadPoolExecutor

 

쉽게 멀티프로세싱과 멀 티쓰 레딩을 파이썬에서 가져오게 하는 구조.

저기서 ProcessPoolExecutor을ThreadPoolExecutor 함수로만 바꿔주기만 하면 바뀌기 때문에 만들만하면 아주 쉽다!

 

여기서 해본 것은 숫자가 있을 때 앞단의 숫자보다 더 작은 것만 모두 가져오는 것을 해봤다.

 

data = pd.DataFrame(np.random.randint(low = 10 , high = 100, size= 100) , columns = ["number"])
data.head()

예를 들어 2번째 인덱스에서 31은 22보다 크니까 22를 가져오고

3번째 인덱스에서는 22와 31을 가져오는 그런 구조를 해보려고 한다.

 

 

 

 

 

 

일단 함수는 다음과 같이 멀티프로세싱에서 돌아갈 함수는 다음과 같이 짰다.

from time import time
from concurrent.futures import ThreadPoolExecutor
LIST_ = data.T.values.tolist()[0]
xx = list(zip(data.index , data.values.tolist()))
def func(tuple_) :
    index , value = tuple_
    store = []
    if index == 0 :
        return ""
    else :
        for i in LIST_[0:(index+1)] :
            if i < value[0] :
                store.append(i)
            else :
                pass
        return ",".join(map(str , store ))

MutlTreading으로 진행

start = time()
pool = ThreadPoolExecutor(max_workers=10)
results = list(pool.map(func, xx ))
end = time()
print(end-start)
results

## 0.012948036193847656

 

개인적으로 파이썬에선 GIL 때문에 MultiTreading이 MultiProcessing보다 느릴 줄 알았는데, 더욱 빨랐다.

왜 그럴까?...

 

from concurrent.futures import ProcessPoolExecutor
start = time()
pool = ProcessPoolExecutor(max_workers=10)
results = list(pool.map(func, xx))
end = time()
print(end-start)
results

위의 그림과 비교해보면 알겠지만 무료 Threading이 10배나 빠르다!!!  

왜 그런지는 모르겠다.

 

일단 작동방식은 아래와 같다고 한다.

참고

https://brownbears.tistory.com/238

 

[Python] Tip - 진정한 병렬성을 실현하려면 concurrent.futures를 고려

파이썬 프로그램을 작성할 때 성능을 충족해야 하는 경우가 있습니다. 코드를 최적화한 이후 조차도 프로그램이 여전히 원하는 수준보다 훨씬 느리게 실행할 수도 있습니다. CPU의 코어 수가 늘어나는 현대의 컴퓨..

brownbears.tistory.com

728x90