-
아래 깃허브를 보고 공부한 내용.
GIL(Global Interpreter Lock)
- 스레드에 사용되는 Lock을 인터프리터 레벨로 확장한 개념
- 여러 스레드의 동시 실행 방지
- 멀티 스레드로 만들었어도 본질적으로 싱글 스레드로 동작
GIL의 장점
- 활용하지 않은 경우 대비 구현이 쉬움
- 레퍼런스 카운팅 메모리 관리방식에서 오버헤드가 적어 싱글 스레드일 때 fine grained lock방식보다 성능이 우월
- C extension을 활용할 때 GIL은 해제되어 C기반 CPU bound program 기반 멀티 스레드는 실행이 빠름
GC 작동 방식: 가비지 컬렉션, 레퍼런스 카운팅을 이용하여 메모리 관리
- 기본적으론 레퍼런스 카운트가 0이면 해제하지만, 이에 도달할 수 없는 reference cycles의 발생 시 GC가 해결
- 순환 참조: 본인 참조, 서로 참조 등(del로 해당 객체를 삭제해버리면 레퍼런스 카운팅 방식으로는 메모리에서 해제 불가)
- GC는 내부적으로 generation(세대)와 threshold가 존재해 세대별로 구분하며 0 세대에 가까울 수록 더 자주 가비지 컬렉션 (default generation = 3)
if 메모리 할당: generation[0].count+=1 if 메모리 해제: generation[0].count-=1 if generation[0].count > threshold[0]: generation[0].count = 0 generation[1].count +=1
- 파이썬은 gc 모듈이 있음: 직접제어 가능
- 오.로.지. 순환참조를 탐지하고 해결하기 위해 존재
- 라이프 싸이클: 가장 오래된 세대부터 역으로 확인해 threashold보다 큰 할당 횟수인경우 collect()를 호출해 GC 수행
- collect: 순환 참조 탐지 알고리즘 수행: 특정 세대 도달 가능 객체, 도달 불가능 객체를 구분한 뒤 도달 불가능 객체 집합을 찾음
- 도달 가능 객체: 상위 세대(0->1)로 merg
- 도달 불가능 객체: callback 수행 후 메모리에서 해제
- 컨테이너 객체: __contatin__ 메서드가 구현되어있는 객체로 객체를 만드는데 컨테이너는 직접 관여하지 않음 (eg. 문자열, 튜플, 리스트, 딕셔너리, 집합 등)
* 컨테이너(Container)란 자료형(Data type)의 저장 모델로 종류에 무관하게 데이터를 저장할 수 있음을 뜻합니다.
- 순환 참조는 컨테이너 객체에서만 발생 : 순함참조 감지를 위해 더블 링크드 리스트 사용해 모든 컨테이너 객체 추적
Celery: 메시지 패싱의 분산 비동기 작업 큐
- Broker는 Message로 Task를 Worker에게 전달하여 Task를 처리
- 멀티프로세싱, eventlet, gevent 사용
- eventlet: 비동기 통신 지원 라이브러리
- gevent: a coroutine -based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev or libuv event loop.
- 하나 혹은 그 이상 Worker에서 동시 실행
- 백그라운드에서 비동기 실행 가능
PyPy.speed > CPython.speed: CPython은 인터프리터, PyPy는 실행추적 JIT(Just In Time) 컴파일 제공 인터프리터
- Python 인터프리터를 다시 파이썬으로 구현
- 실행추적 JIT 컴파일: 메서드 단이로 최적화 하는 전통적 JIT와는 다르게 런타임에서 자주 실행되는 루프 최적화
- RPython: 실행추적 JIT 컴파일을 C로 구현해 툴체인을 포함하는 일종의 인터프리터 제작 프레임워크(언어)
- 툴채인:주로 다른 컴퓨터 또는 시스템의 소프트웨어 제품을 만드는 데 사용되는 컴퓨터 프로그램 개발 도구들의 집합
- 동적 언어인 Python에서 표준 라이브러리와 문법에 제약을 가해 변수의 정적 컴파일이 가능
- 동적 언어 인터프리터 구현
메모리 누수가 발생하는 경우(사용자 부주의)
1. mutable 객체를 기본 인자값으로 사용
2. Tiemout이 없는 캐시 데이터 사용
3. __del__ 메서드 재정의: 순환 참조 중인 클래스가 __del__ 메서드를 재정의하고 있다면 GC로 해제 불가능
Duck Typing: 객체의 변수와 메서드가 그 객체의 적합성을 결정하는 것을 의미함(특히 동적 타입 프로그래밍 언어에서 많이 사용)
- 필요한 메서드가 모두 구현되어 있어야 함, 그렇지 않은 duck typing이 실패된 것
Timsort: Python의 sortsms timsort로 구현되어있어(2,3버전부터) merge sort와 insert sortrk 병합된 안정정렬
- 시간 복잡도가 O(n)~O(n log n)이 보장되며, 공간 복잡도 역시 O(n).
- 안정정렬: 동일 키 요소의 순서가 섞이지 않고 보장됨
'2020년' 카테고리의 다른 글
노션으로 새해 준비하기, 노션 다이어리 (0) 2020.12.21 mac os에 터미널을 이용해 아나콘다 설치하고 파이썬 버전을 설정한 가상환경 생성하기 (3) 2020.12.18 쥬피터 셀 실행시간 출력하기 (0) 2020.12.13 주피터 한글 설정 (0) 2020.12.13 클린 코드에 대해 (0) 2020.11.26