Python 의 GIL(전역 해석 기 잠 금)을 자세히 설명 하고 GIL 을 해결 하 는 몇 가지 방안

먼저 GIL 면접 문 제 를 보 겠 습 니 다.
Python GIL 의 개념 과 python 다 중 스 레 드 에 미 친 영향 을 묘사 합 니까?다 중 스 레 드 캡 처 웹 페이지 를 만 드 는 프로그램 을 만 들 고 다 중 스 레 드 캡 처 프로그램 이 단일 스 레 드 보다 성능 이 향상 되 었 는 지 설명 하 며 이 유 를 설명 합 니 다.
GIL:전역 해석 기 잠 금 이 라 고도 합 니 다.모든 스 레 드 가 실행 되 는 과정 에서 먼저 GIL 을 가 져 와 서 같은 시간 에 하나의 스 레 드 만 실 행 될 수 있 도록 해 야 합 니 다.다 중 스 레 드 와 경쟁 프로그램의 전체 변 수 를 해결 하기 위해 발생 하 는 스 레 드 안전 문 제 를 해결 하 는 것 이 목적 입 니 다.python 언어의 특성 이 아 닙 니 다.역사적 인 이유 로 CPython 해석 기 에서 제거 하기 어 려 울 뿐 입 니 다.python 언어 실행 환경 은 대부분 CPython 해석 기 에 기본 으로 있 기 때 문 입 니 다.
하나의 사례 를 통 해 단일 스 레 드 와 다 중 스 레 드 의 cpu 점용 률 을 알 수 있 습 니 다.
Ubuntu 터미널 명령 열기:htop,리 턴 을 입력 하 십시오.빨간색 화살표 가 가리 키 는 2 는 현재 제 가상 컴퓨터 에서 CPU 가 두 개의 핵심 수 를 가지 고 있 습 니 다.

다음은 하나의 사례 를 통 해 단선 순환 과 다 중 스 레 드 순환 의 CPU 점용 률 을 알 아 보 겠 습 니 다.
단선 순환.py: 

#coding=utf-8
while True:
  pass
이 프로그램 을 실행 하면 다음 화면 이 나타 납 니 다:

이 때 새 창 을 열 고 htop 을 입력 하여 CPU 점용 률 을 봅 니 다.그 중 하나의 CPU 점용 률 은 거의 100%입 니 다.

두 스 레 드 순환.py

#coding=utf-8
import threading
 
#      
def test():
  while True:
    pass
 
t1=threading.Thread(target=test)
t1.start()
 
#      ,
while True:
  pass
이 때 터미널 을 새로 열 고 htop 을 입력 하여 CPU 점용 율 을 확인 하면 두 개의 CPU 가 모두 차지 하지 않 고 교체 되 어 실 행 된 것 을 볼 수 있 습 니 다.

 이 는 다 중 스 레 드 에서 모든 스 레 드 가 실행 되 는 과정 에서 먼저 GIL 을 가 져 와 같은 시간 에 하나의 스 레 드 만 실 행 될 수 있 도록 해 야 한 다 는 것 을 검증 한 것 이다.
GIL 의 존재 로 인해 다 중 스 레 드 라 도 사실은 같은 시간 에 한 스 레 드 만 운행 할 수 있 습 니 다.이렇게 다 중 스 레 드 의 운행 효율 은 단일 스 레 드 와 같 지 않 습 니까?그런데 왜 다 중 스 레 드 를 사용 해 야 합 니까?
예전 의 컴퓨터 는 기본적으로 단일 핵 CPU 였 기 때문에 다 중 스 레 드 와 단일 스 레 드 는 거의 차이 가 보이 지 않 았 다.그러나 컴퓨터 의 신속 한 발전 으로 인해 현재 의 컴퓨터 는 거의 다 중 핵 CPU 이 고 적어도 두 개의 핵심 수 였 다.이때 차이 가 나 타 났 다.예전 의 사례 를 통 해 저 는 다 중 핵 CPU 에서 도 다 중 스 레 드 는 같은 시간 에 한 개의 스 레 드 만 운행 되 고 있다 는 것 을 알 게 되 었 습 니 다.이렇게 하면 다 핵 CPU 의 장점 을 이용 할 수 없 을 뿐만 아니 라,오히려 각 스 레 드 가 여러 CPU 에서 번갈아 실행 되 기 때문에 서로 다른 CPU 에서 전환 할 때 자원 의 낭 비 를 초래 하고 오히려 더 느 릴 수 있다.즉,하나의 프로 세 스 가 하나의 gil 자물쇠 만 존재 하기 때 문 입 니 다.여러 스 레 드 를 실행 할 때 내부 에서 gil 자 물 쇠 를 빼 앗 습 니 다.이 는 특정한 스 레 드 가 자 물 쇠 를 빼 앗 지 않 았 을 때 cpu 를 기다 리 게 하고 다 중 핵 cpu 자원 을 합 리 적 으로 이용 하지 못 하 게 할 수 있 습 니 다.
예 를 들 어 다 중 스 레 드 를 사용 하여 웹 페이지 내용 을 캡 처 할 때 IO 가 막 혔 을 때 실행 중인 스 레 드 는 잠시 GIL 자 물 쇠 를 방출 합 니 다.이때 다른 스 레 드 는 이 공간 시간 을 이용 하여 자신의 코드 를 실행 하기 때문에 다 중 스 레 드 캡 처 는 단일 스 레 드 캡 처 보다 성능 이 좋 습 니 다.
여기 서 두 가지 개념 을 소개 해 야 한다.밀집 형 과 IO 밀집 형 을 계산 해 야 한다.
계산 집약 형:대량의 수치 계산 을 해 야 한다.예 를 들 어 억 대의 디지털 계산,원주율 계산,영상 에 대해 고 화질 디 코딩 등 이다.이러한 계산 집약 형 임 무 는 다 중 임무 로 도 완성 할 수 있 지만 주요 시간 은 임무 전환 시간 에 걸 리 는데 이때 CPU 가 임 무 를 수행 하 는 효율 이 비교적 낮다.
IO 밀집 형:네트워크 요청(time.sleep(),디스크 IO 와 관련 된 작업 은 모두 IO 밀집 형 작업 입 니 다.이러한 작업 의 특징 은 CPU 소모 가 적 고 작업 의 대부분 시간 이 IO 작업 이 완성 되 기 를 기다 리 는 것 입 니 다(IO 의 속도 가 CPU 와 메모리 의 속도 보다 훨씬 낮 기 때 문 입 니 다).IO 집약 형 미 션 의 경우 미 션 이 많 을 수록 CPU 효율 이 높 지만 한계 가 있다.
GIL 문제 해결 방안:
1.C,Java 와 같은 다른 언어 사용
2.자바 와 같은 다른 해석 기 jython 사용 하기
3.다 중 프로 세 스 사용
스 레 드 에서 GIL 잠 금 을 해제 한 경우:
1.IO 작업 등 차단 을 일 으 킬 수 있 는 system call 이전 에는 잠시 GIL 을 풀 수 있 지만,실행 이 완료 되면 다시 GIL 을 가 져 와 야 합 니 다.
2.Python 3.x 는 타 이 머 를 사용 합 니 다(실행 시간 이 한도 값 에 도달 하면 현재 스 레 드 에서 GIL 을 방출 합 니 다)또는 Python 2.x,tickets 수 는 100 에 달 합 니 다.
GIL 면접 문제 참고 답안:
파 이 썬 언어 는 GIL 과 아무런 관계 가 없다.단지 역사적 인 이유 로 Cpython 가상 컴퓨터(해석 기)에서 GIL 을 제거 하기 어렵 습 니 다GIL:전역 해석 기 잠 금.모든 스 레 드 가 실행 되 는 과정 에서 먼저 GIL 을 가 져 와 같은 시간 에 코드 를 실행 할 수 있 도록 해 야 합 니 다
  • 스 레 드 에서 GIL 자 물 쇠 를 방출 하 는 경우:IO 작업 등 차단 을 일 으 킬 수 있 는 system call 전에 잠시 GIL 을 방출 할 수 있 지만 실행 이 끝 난 후에 GIL Python 3.x 를 다시 가 져 와 야 합 니 다.타 이 머 를 사용 해 야 합 니 다(실행 시간 이 한도 값 에 도달 하면 현재 스 레 드 에서 GIL 을 방출 합 니 다)또는 Python 2.x,tickets 수 는 100 에 달 합 니 다
  • 파 이 썬 이 다 중 프로 세 스 를 사용 하 는 것 은 다 핵 CPU 자원 을 이용 할 수 있 습 니 다4.567917.다 중 스 레 드 기어 오 르 는 것 이 단일 스 레 드 보다 성능 이 향상 되 었 습 니 다.IO 블록 을 만나면 자동 으로 GIL 자 물 쇠 를 방출 하기 때 문 입 니 다파 이 썬 의 GIL(전역 해석 기 잠 금)에 대한 자세 한 설명 과 GIL 을 해결 하 는 몇 가지 방안 에 관 한 글 은 여기까지 입 니 다.더 많은 파 이 썬 GIL 전역 해석 기 잠 금 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기