본문 바로가기
IT

python에서의 thread 동시성 문제 (feat. GIL, Global Interpreter Lock )

by 이농이능 2018. 2. 8.

1. 파이썬이란,


파이썬은 1991년에 발표된 고급 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑 대화형 언어이다. 

다시 말하면, 다양한 플랫폼에서 사용할 수 있고, 한 줄씩 바로 실행할 수 있으며 실행 시간에 자료형을 검사하기 때문에 변수는 모든 자료형의 값을 가질 수 있다. A = [ 'ab' , 1 , 12.5 ] 이렇게 리스트에 다양한 자료형을 넣을 수 있는 것이다.

파이썬의 장점은 배우기 쉽고 어디서나 실행될 수 있다는 점이다. 읽고 사용하가 쉬우며 잘 설계된 내장 라이브러리와 표준 라이브러리, 서드파티 오픈소스 라이브러리와 모듈이 방대하기 때문에 인기가 높아졌으며 2017년 가장 많이 사용하는 top 10 프로그래밍 언어에서 1위를 차지하였다.



출처 : https://spectrum.ieee.org/computing/software/the-2017-top-programming-languages



2. 파이썬이 No.1인 이유 


파이썬의 가장 큰 장점은 '쉽다'라는 것이다. 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있는 언어이다. 따라서 프로그래머는 굳이 컴퓨터의 사고 체계에 맞추어서 프로그래밍을 하려고 애쓸 필요가 없다. 

if 4 in [1,2,3,4]: print("4가 있습니다")

위의 예제는 다음처럼 읽을 수 있다:

"만약 4가 1,2,3,4중에 있으면 "4가 있습니다"를 출력한다."

프로그램을 모르더라도 직관적으로 무엇을 뜻하는지 알 수 있다. 또한 오픈 소스인 파이썬은 당연히 무료이다. 사용료 걱정없이 언제 어디서든 파이썬을 다운로드하여 사용할 수 있다.


3. 그렇다면 파이썬의 단점은? 


파이썬으로 도스나 리눅스 같은 운영체제, 엄청난 횟수의 반복과 연산을 필요로 하는 프로그램 또는 데이터 압축 알고리즘 개발 프로그램 등을 만드는 것은 어렵다. 즉, 대단히 빠른 속도를 요구하거나 하드웨어를 직접 건드려야 하는 프로그램에는 어울리지 않는다.

파이썬의 단점이라고 할 수 있는데, 인터프리터 언어이기 때문에 컴파일언어보다 느리고 따라서 실시간 거래 시스템처럼 매우 짧은 응답시간을 필요로 하는데 사용할 수 없다. 다시 말해서 파이썬은 동시다발적인 멀티스레드를 처리하거나 CPU에 집중된 많은 스레드를 처리하는 데 적합하지 않다. 이는 바로 GIL(Global Interpreter Lock) 때문이다. 이 메커니즘은 인터프리터가 한 번에 하나의 바이크 코드명령만 실행하도록 하는 것을 말하는데  프로그래머는 만들고자 하는 프로그램의 대부분을 파이썬으로 만들 수 있지만 시스템 프로그래밍이나 하드웨어 제어와 같은 매우 복잡하고 반복 연산이 많은 프로그램은 만들 수 없는 것이 그 이유이다. 


4. 파이썬에서 Thread를 사용한다면,, 


파이썬에서 쓰레드를 사용할려고 할 때 바로 문제점을 파악할 수 있다. 흔히 생각하는 쓰레드라면, 동시에 작업을 수행하는 것으로 알고 있겠지만 파이썬에서는 쓰레드를 여러개 쓰면 속도가 더 느려지게 된다. 앞에서 언급한 GIL 때문이다. 파이썬은 자원배분을 한 쓰레드에게 할당한 후, 그 쓰레드가 끝날 때까지 Lock 을 걸어 다른 쓰레드가 접근하지 못하게 한다. 

 


그렇기 때문에 파이썬에서 스레드 여러개를 이용하는 프로그램을 만들게 되면 동시에 일하는 것을 바라지만 실제로는 CPU를 점유할 수 있는 쓰레드는 한 개이기 때문에 실행 속도가 더 느려지게 되는 것이다. 

 



5. GIL ..길.. 


GIL은 멀티 쓰레드 프로그램에서 성능이 떨어지게 하지만 파이썬을 포함한 많은 인터프리터 언어는 GIL을 사용하고 있다. 

그 이유는 GIL을 이용해서 멀티쓰레드를 구현하는 것이 parallel 한 멀티쓰레드를 구현하는 것보다 훨씬 쉽다는 것이다. 

또한 싱글스레드에서 성능이 매우 높고 parallel한 멀티쓰레드로 싱글 스레드를 구현할 경우에 성능이 안좋아지기 때문에 파이썬의 창시자 귀도 반 로섬은 CPython에서 GIL을 없애는 대신 싱글 쓰레드에서 성능을 떨어뜨릴 구현은 받아들이지 않겠다고 선언하기도 했다. 


GIL을 도입하면 인터프리터의 구현이 쉬워지고 Garbage Collector 만들기도 좋으며 C/C++ 확장 개발에 용이하기 때문에 파이썬을 많이 사용하고 있다. 또한 프로그램이 I/O를 많이 쓰면 대부분 I/O bound 이기 때문에 파이썬의 쓰레드를 사용하는 것이 좋은 경우도 있다.



6. python에서 병렬작업은 안되나요? 


아니다. 우리가 원하는 병렬적인 작업을 하기 위해서는 쓰레드 대신 프로세스를 만들어주는 라이브러리 Multiprocessing 모듈을 사용하면 된다. multiprocessing 모듈은 쓰레드 대신 프로세스를 띄워준다. 즉, 하나의 interpreter를 쓰는게 아니라 여럿의 프로세서를 구동시키는 것이다. 이 경우에는 프로세스 관리는 python에서 하는 것이 아니라 OS에서 하는 것이기 때문에, OS에서 적절하게 프로세스를 코어별로 할당을 하게 해서, 전체적으로 스피드를 올려주게 된다.




멀티프로세싱 모듈은 fork를 통해서 동시에 여러 프로세스에 원하는 작업을 실행할 수 있도록 도와주는 모듈이다. 

파이썬에서는 OS 모듈에 속한 fork() 함수를 사용해서 여러 프로세스를 사용할 수 있다. 파이썬 프로세스가 fork() 함수를 호출하면 프로세스의 복사본이 생성되고 이 카피는 모든 데이터와 코드를 부모 프로세스에서 직접 가져와 운영 체제에서 자체 PID를 얻는 완전히 독립적인 프로세스로 수행된다. IPC에서 손해를 보긴하지만 이를 지원하는 각종 메커니즘도 존재하며 쓰레드와 똑같이 사용할 수 있다. 





출처 : 

https://www.slideshare.net/kthcorp/h32011c6pythonandcloud-111205023210phpapp02?from_m_app=ios

https://medium.com/@mjhans83/python-gil-f940eac0bef9

http://pyengine.blogspot.kr/2011/11/threading-gil.html

https://www.meccanismocomplesso.org/en/multiprocessing-in-python-il-fork-dei-processi/

https://www.slideshare.net/deview/2d4python

https://kimdoky.github.io/python/2017/11/27/library-book-chap13-1.html

'IT' 카테고리의 다른 글

[2018_03_27] 찾아본 것  (0) 2018.03.27
json  (0) 2018.03.21
awk 명령어  (0) 2018.03.08
Process와 Thread  (0) 2018.02.06
무료로 사용하기 좋은 웹 컴파일러와 개발환경  (0) 2018.02.05