티스토리 뷰

728x90
반응형

안녕하세요. Teus입니다.

이번 포스팅은 Python 3.13버전 릴리즈와 함께 공개된

Free-Threaded CPython을 빌드하고, 테스트 해본 내용을 담아봅니다.

0. GIL

GIL은 예전부터 제 포스팅에 자주 등장했지만

Python의 GC를 구현하기 위해서 한순간에는 하나의 Thread만 실행 가능하게 만드는 Lock의 일종 입니다.

그래서, Python을 사용할 경우 Thread를 썼지만 다수의 코어를 활용하지 못하는 속상한 상황이 벌어집니다.

image.png


(멀티코어를 동시에 사용하지 못하는 거세당한 python의 멀티Thread🥺)

하지만 python.org의 discussion을 통해서 GIL-free상태의 Python의 개발 방향에 대해서 논의된 적이 있습니다.

그리고, 로드맵에 있던 대로 기본 모드가 아니라

별도의 빌드를 통해서 no-GIL형태의 Python을 3.13부터 실험적으로 빌드할 수 있게 되었습니다!

1. no-GIL 빌드하기

아래 공식 홈페이지와 게시글을 참고 하였습니다.
https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython
https://py-free-threading.github.io/installing_cpython/#__tabbed_1_1
리눅스 기준으로 진행합니다

먼저 curl을 사용해서 python공식 홈페이지에서 3.13.0버전의 소스코드를 받아옵니다.

export PYTHON_VERSION=3.13.0
export PYTHON_MAJOR=3
curl -O https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz

그리고 받아온 소스파일을 압축 해제하고, 설치를 진행합니다.

tar -xvzf Python-${PYTHON_VERSION}.tgz
cd Python-${PYTHON_VERSION}
./configure --with-pydebug --disable-gil
sudo make
sudo make install

이러면 이제 /usr/local/bin/python3위치에 정상적으로 python3.13.0을 확인할 수 있습니다.

image.png

실제 python을 켜봐도 experimental build임을 확인할 수 있습니다.

image.png

2. benchmark

이제 threading을 사용할 때 실제로 gil없이 빠르게 계산이 되는지를 확인해 보겠습니다.

이번에는 단순하게 ElementWise Power연산을 진행 해 보았습니다.

from multiprocessing.pool import ThreadPool
import threading

def power_foo(x):    
    return x*x
cnt = 10000000
import time
my_pool = ThreadPool(16)
st = time.time()
ret = my_pool.map(double_foo, [i for i in range(cnt)])
print("threading time : ", time.time() - st)

st = time.time()
ret = list(map(double_foo, [i for i in range(cnt)]))
print("normal time : ", time.time() - st)

image.png

보는것처럼 속도향상을 얻어 갈 수 있습니다.

3. 이모저모.

하지만 아직 실험 빌드인 만큼, 실행 후 pool을 닫지않는다 던가 하면 Error를 발생시킵니다.

image.png

아무래도 아직까지는 동작만 가능하고, 완벽한 동작을 보장하지는 않는것 같습니다.

하지만 이런 실험빌드를 통해서라도 GIL Free상태의 코드실행을 Python에서 볼 수 있다니 세삼눈물이 다 납니다.🥺

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함