데이터엔지니어 취업 특강을 들으면서 python의 GIL이라는 단어를 처음 들었다.
python은 Global Interface Lock이 있어서 특정 시점에 싱글 스레드만 사용 가능하도록 제한하는 기능이다.
GIL은 파이썬의 코드를 여러 개의 스레드가 동시에 읽지 못하도록 만든다.
그 이유가 뭐냐면, 파이썬은 참조를 통해 변수에 id를 준다. 다른 언어는 변수에 값에 주소를 줘서 할당한다.
비유를 하면 숫자에 티켓을 붙여서 변수로 불러오는데, 이후 이 티켓의 개수를 세는 레퍼런스 카운팅을 실시한다.
근데, 여러 개의 쓰레드가스레드가 동시에 티켓의 개수를 세 버리면 여러 스레드가 티켓의 개수를 세서 동기화가 일어나지 않는 Race Condition이 발생할 수 있다.
여러 스레드가 공유 데이터를 수정해서 동기화가 발생하지 않을 수 있기 때문에 파이썬에서는 이를 막아둔 것이다.
그래서 이번 파이썬 3.13에서는 GIL을 풀 수 있는 기능을 실험적으로 추가해 봤다. 내가 멀티 스레드를 통해 속도를 개선할 일이 있을까 싶지많은 신기한 기능이라서 한 번 올려보았다.
https://docs.python.org/3/whatsnew/3.13.html#free-threaded-cpython
What’s New In Python 3.13
Editors, Adam Turner and Thomas Wouters,. This article explains the new features in Python 3.13, compared to 3.12. Python 3.13 was released on October 7, 2024. For full details, see the changelog. ...
docs.python.org
Python 3.13 새 기능 및 주요 변경점 요약 (2024년 10월 7일 출시)
1. 인터프리터 개선
• 새로운 상호작용(interactive) 인터프리터 도입:
• 멀티라인 편집 및 명령 기록 유지.
• 색상이 기본 활성화된 오류 메시지와 도움말.
• 키보드 단축키(F1~F3)를 통한 편리한 명령 실행.
• 오류 메시지 개선:
• 표준 라이브러리와 충돌하는 스크립트 이름에 대한 경고.
• 잘못된 키워드 인자 사용 시 올바른 제안을 포함한 메시지.
2. Free-threaded CPython (PEP 703):
• GIL(Global Interpreter Lock) 없이 실행 지원(실험적 기능).
• 멀티코어 CPU에서 성능 향상 가능.
• 새로운 sys.\_is\_gil\_enabled() 함수로 GIL 활성화 상태 확인 가능.
3. JIT(Just-In-Time) 컴파일러 (PEP 744):
• 실험적으로 도입된 JIT 컴파일러.
• 실행 속도는 일부 프로그램에서 향상 가능.
4. 타입 시스템 개선:
• PEP 696: TypeVar와 같은 타입 매개변수에 기본값 지원.
• PEP 702: warnings.deprecated() 데코레이터 추가.
• PEP 705: TypedDict 항목을 읽기 전용으로 설정하는 ReadOnly 도입.
주요 표준 라이브러리 변경점
1. argparse:
• 명령줄 옵션과 인자를 deprecated 처리할 수 있는 기능 추가.
2. base64:
• 새로운 Z85 인코딩/디코딩 함수 추가.
3. dbm:
• SQLite를 기본 백엔드로 사용하는 dbm.sqlite3 추가.
4. os:
• 타이머 알림 파일 디스크립터와 관련된 Linux 기능 추가.
5. ssl:
• 기본 검증 설정 강화(보안 향상).
6. copy:
• 객체 복사를 위한 copy.replace() 함수 추가.
보안 개선
• SSL 기본 컨텍스트에서 강력한 인증 플래그(VERIFY\_X509\_PARTIAL\_CHAIN, VERIFY\_X509\_STRICT) 활성화.
• 보안 취약점 방지를 위한 경고 및 동작 개선.
중요 제거 사항
1. PEP 594:
• 더 이상 사용되지 않는 19개의 표준 라이브러리 모듈 제거:
• 예: cgi, telnetlib, pipes, sunau 등.
2. 2to3 도구:
• Python 2를 Python 3으로 변환하던 도구 제거.
이외 개선 사항
1. 표준 문법 개선:
• 클래스 정의의 첫 번째 줄 번호를 기록하는 **firstlineno** 속성 추가.
• locals() 반환값을 조작할 때의 동작 명확화(PEP 667).
2. 성능 최적화:
• 여러 표준 라이브러리 모듈의 가져오기 속도 개선.
• textwrap.indent() 속도 약 30% 향상.