본문 바로가기

Computer Science/Python

[Python] GIL(Global interpreter Lock), 파이썬 병렬 처리 속도 향상, multiprocessing

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배 이상 속도가 향상되었다. 파이썬 전처리 과정이 필요할 때 활용해볼 수 있을 것 같다.

 

 

참고

https://wikidocs.net/124290

 

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