[ Python ] multiprocessing / concurrent.futures
2019. 8. 18. 19:23ㆍ분석 Python/구현 및 자료
멀티프로세싱 공부
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
끝
728x90
'분석 Python > 구현 및 자료' 카테고리의 다른 글
[ Python ] How to fast String to pandas data frame 연습 (0) | 2019.09.04 |
---|---|
[ Python ] logging 만들어보기 (FileHandler 와 StreamHandler 위주로) (0) | 2019.08.25 |
[ Python ] 사용한 package 모두 저장해서 다른 곳에서 그대로 사용하는방법 (0) | 2019.08.12 |
[ Python ] threading 에 대해서 잘 설명된 글 (0) | 2019.08.11 |
[ Python ] 동시성과 Future / concurrent.futures 알아보기 (0) | 2019.08.11 |