GIL
GIL(Global interpreter Lock) : 파이썬 인터프리터가 객체들에 대한 접근을 보호하기 위해 한 스레드만 하나의 바이트코드를 실행 시킬 수 있도록 해주는 Lock
파이썬은 이러한 GIL 때문에 싱글스레드 기반병렬 처리가 어렵다. 이를 해결하기 위해, Spark에서 병렬 모듈을 쓰거나 파이썬에서 병렬 프로세싱을 지원하는 라이브러리를 쓸 수 있다.
multiprocessing
multiprocessing은 Python에서 멀티 프로세스를 활용하여 2가지 또는 그 이상의 일을 동시에 실행할 수 있게 하는 모듈이다.
ex) 다음은 CPU 연산이 많은 heavy_work() 함수를 4번 실행하고 그 소요 시간을 측정하는 예제이다.
import time
def heavy_work(name):
result = 0
for i in range(4000000):
result += i
print('%s done' % name)
start = time.time()
for i in range(4):
heavy_work(i)
end = time.time()
print("수행시간: %f 초" % (end - start))
0 done
1 done
2 done
3 done
수행시간: 2.027041 초
multiprocessing 모듈은 멀티 프로세서와 별개의 메모리를 사용하여 완전히 독립하여 병렬 프로그래밍할 수 있다. 단, 여러 개의 CPU가 있는 멀티코어 환경에서만 가능하다. 예를들어 파이썬에서 16개 코어가 있는 환경에서 1개의 코어만 사용할 때 사용할 수 있다.
import time
def heavy_work(name):
result = 0
for i in range(4000000):
result += i
print('%s done' % name)
if __name__ == '__main__':
import multiprocessing
start = time.time()
procs = []
for i in range(4):
p = multiprocessing.Process(target=heavy_work, args=(i, ))
p.start()
procs.append(p)
for p in procs:
p.join() # 프로세스가 모두 종료될 때까지 대기
end = time.time()
print("수행시간: %f 초" % (end - start))
multiprocessing.Process 클래스로 프로세스를 생성한다. 프로세스 생성 시 target에는 실행할 함수명을 지정하고 args에는 그 함수에 전달할 인수를 설정한다. start() 함수로 프로세스를 실행하고 join() 함수로 프로세스가 종료되기를 기다린다.
0 done
3 done
1 done
2 done
수행시간: 0.663679 초
멀티코어 환경에서 3배 이상 속도가 향상되었다. 파이썬 전처리 과정이 필요할 때 활용해볼 수 있을 것 같다.
참고
067 멀티 프로세스를 이용하여 병렬로 처리하려면? ― multiprocessing
multiprocessing은 멀티 프로세스를 활용하여 2가지 또는 그 이상의 일을 동시에 실행할 수 있게 하는 모듈이다. ## 문제 다음은 CPU 연산이 많은 heavy_w…
wikidocs.net
https://qkqhxla1.tistory.com/270
파이썬의 멀티쓰레딩과 멀티프로세싱.
문제될시 댓글달아주시면 글 삭제하겠습니다. 파이썬코리아에서 공유된 링크에서 얻은 정보이다. http://www.slideshare.net/kthcorp/h32011c6pythonandcloud-111205023210phpapp02?from_m_app=ios 에서 정보를 얻었으며
qkqhxla1.tistory.com
'Computer Science > Python' 카테고리의 다른 글
[Python] 이터레이터(iterator)와 제너레이터(generator) (0) | 2023.06.13 |
---|