복붙노트

[PYTHON] CPython에서 전역 인터프리터 잠금 (GIL)이란 무엇입니까?

PYTHON

CPython에서 전역 인터프리터 잠금 (GIL)이란 무엇입니까?

글로벌 해석자 잠금이란 무엇이며 왜 문제가됩니까?

파이썬에서 GIL을 제거하는 데 많은 소음이 있었고, 왜 그렇게 중요한지 이해하고 싶습니다. 필자는 컴파일러 나 통역사를 직접 작성한 적이 없으므로 세부 사항에 대해 검소하지 마십시오. 아마도 이해할 필요가있을 것입니다.

해결법

  1. ==============================

    1.Python의 GIL은 인터프리터 내부에 대한 액세스를 다른 스레드에서 직렬화하기위한 것입니다. 멀티 코어 시스템에서는 여러 스레드가 효과적으로 여러 코어를 사용할 수 없다는 것을 의미합니다. (만약 GIL이이 문제를 일으키지 않는다면, 대부분의 사람들은 GIL에 신경을 쓰지 않을 것입니다 - 그것은 멀티 코어 시스템의 보급이 증가함에 따라 쟁점으로 제기 될뿐입니다.) 당신이 자세히 이해하고 싶다면, 이 비디오를 보거나이 슬라이드 세트를 볼 수 있습니다. 너무 많은 정보일지도 모르지만 그때 당신은 세부 사항을 물어 보았습니다 :-)

    Python의 GIL은 인터프리터 내부에 대한 액세스를 다른 스레드에서 직렬화하기위한 것입니다. 멀티 코어 시스템에서는 여러 스레드가 효과적으로 여러 코어를 사용할 수 없다는 것을 의미합니다. (만약 GIL이이 문제를 일으키지 않는다면, 대부분의 사람들은 GIL에 신경을 쓰지 않을 것입니다 - 그것은 멀티 코어 시스템의 보급이 증가함에 따라 쟁점으로 제기 될뿐입니다.) 당신이 자세히 이해하고 싶다면, 이 비디오를 보거나이 슬라이드 세트를 볼 수 있습니다. 너무 많은 정보일지도 모르지만 그때 당신은 세부 사항을 물어 보았습니다 :-)

    참고 Python의 GIL은 참조 구현 인 CPython의 문제 일뿐입니다. Jython과 IronPython에는 GIL이 없습니다. 파이썬 개발자는 일반적으로 C 확장자를 작성하지 않는 한 GIL을 사용하지 않습니다. C 확장자 작성자는 확장이 I / O를 차단할 때 GIL을 릴리스해야하므로 Python 프로세스의 다른 스레드가 실행될 수 있습니다.

    업데이트 : 이전의 blip.tv 링크가 썩어서 Youtube를 가리 키도록 동영상 링크가 업데이트되었습니다.

  2. ==============================

    2.서로의 데이터를 실제로 접하지 않는 여러 스레드가 있다고 가정합니다. 이들은 가능한 한 독립적으로 실행되어야합니다. 함수를 호출하기 위해 획득해야하는 "전역 잠금"이 있다면 병목 현상이 발생할 수 있습니다. 처음에는 여러 개의 스레드를 사용하는 것이 많은 이점을 얻지 못할 수 있습니다.

    서로의 데이터를 실제로 접하지 않는 여러 스레드가 있다고 가정합니다. 이들은 가능한 한 독립적으로 실행되어야합니다. 함수를 호출하기 위해 획득해야하는 "전역 잠금"이 있다면 병목 현상이 발생할 수 있습니다. 처음에는 여러 개의 스레드를 사용하는 것이 많은 이점을 얻지 못할 수 있습니다.

    현실 세계의 비유를 들으려면 : 단 하나의 커피 잔만 가진 회사에서 일하는 100 명의 개발자를 상상해보십시오. 대부분의 개발자는 코딩 대신 커피를 기다리는 데 시간을 할애 할 것입니다.

    파이썬에 특화된 것은 없습니다. 파이썬이 처음에는 GIL을 필요로했는지에 대한 세부 사항을 알지 못합니다. 그러나 일반적인 개념을 더 잘 이해할 수 있기를 바랍니다.

  3. ==============================

    3.우선 python GIL이 제공하는 것을 이해하자.

    우선 python GIL이 제공하는 것을 이해하자.

    모든 작업 / 명령은 인터프리터에서 실행됩니다. GIL은 인터프리터가 특정 시점에 단일 스레드에 의해 유지되도록합니다. 그리고 다중 쓰레드를 가진 파이썬 프로그램은 하나의 인터프리터에서 작동합니다. 특정 시점에서이 인터프리터는 단일 스레드에 의해 개최됩니다. 인터프리터를 보유하고있는 스레드 만이 임의의 순간에 실행 중임을 의미합니다.

    이제 그 이유는 무엇입니까?

    컴퓨터에 여러 개의 코어 / 프로세서가있을 수 있습니다. 다중 코어는 여러 스레드가 동시에 실행할 수 있도록합니다. 즉, 여러 스레드가 특정 시점에 실행할 수 있습니다. 그러나 인터프리터는 단일 스레드에 의해 유지되므로 다른 스레드는 코어에 액세스 할 수 있어도 아무 것도하지 않습니다. 따라서, 현재 인터프리터를 보유하고있는 스레드가 사용하는 코어 인 단일 코어 만 사용 중이므로 여러 코어에서 어떤 이점도 얻지 못합니다. 따라서 프로그램이 마치 단일 스레드 프로그램 인 것처럼 실행하는 데 시간이 오래 걸립니다.

    그러나 I / O, 이미지 처리 및 NumPy 번호 크런치와 같은 잠재적으로 블로킹 또는 장기 실행 작업은 GIL 외부에서 발생합니다. 여기에서 찍은. 따라서 이러한 작업의 경우 GIL이 있음에도 불구하고 다중 스레드 작업은 단일 스레드 작업보다 여전히 빠릅니다. 그래서 GIL은 항상 병목 현상이 아닙니다.

    편집 : GIL은 CPython의 구현 세부 사항입니다. IronPython과 Jython에는 GIL이 없으므로 PyPy와 Jython을 사용하지 않았고이 점을 모른다고 생각한 진정한 멀티 스레드 프로그램이 가능해야합니다.

  4. ==============================

    4.두 스레드가 동일한 변수에 액세스 할 때마다 문제가 발생합니다. 예를 들어, C ++에서 문제를 피하는 방법은 두 개의 스레드가 동시에 객체의 setter를 입력하는 것을 막기 위해 뮤텍스 잠금을 정의하는 것입니다.

    두 스레드가 동일한 변수에 액세스 할 때마다 문제가 발생합니다. 예를 들어, C ++에서 문제를 피하는 방법은 두 개의 스레드가 동시에 객체의 setter를 입력하는 것을 막기 위해 뮤텍스 잠금을 정의하는 것입니다.

    파이썬에서는 멀티 스레딩이 가능하지만 동시에 두 스레드를 실행할 수는 없습니다. 하나의 파이썬 명령어보다 정밀한 입상. 실행중인 스레드가 GIL이라는 전역 잠금을 받고 있습니다.

    즉, 멀티 코어 프로세서를 활용하기 위해 멀티 스레드 코드를 작성하기 시작하면 성능이 향상되지 않습니다. 일반적인 해결 방법은 다중 프로세스로 구성됩니다.

    예를 들어 C로 작성한 메소드 안에 있다면 GIL을 해제 할 수 있습니다.

    GIL의 사용은 파이썬에 고유하지 않고 가장 보편적 인 CPython을 포함하여 인터프리터의 일부에 속한다. (#edited, 의견보기)

    GIL 문제는 여전히 Python 3000에서 유효합니다.

  5. ==============================

    5.파이썬은 진정한 의미의 멀티 스레딩을 허용하지 않습니다. 그것은 멀티 스레딩 패키지를 가지고 있지만 코드 속도를 높이기 위해 멀티 스레드를 원한다면 일반적으로 사용하지 않는 것이 좋습니다. 파이썬에는 GIL (Global Interpreter Lock)이라는 구조가 있습니다. GIL은 한 번에 하나의 '스레드'만 실행할 수 있도록합니다. 쓰레드가 GIL을 얻고, 약간의 작업을 한 다음, GIL을 다음 쓰레드로 넘깁니다. 이것은 매우 빠르게 발생하므로 사용자의 스레드가 병렬로 실행되는 것처럼 보일 수 있지만 실제로는 동일한 CPU 코어를 사용하여 순서를 바꾸고 있습니다. 이 모든 GIL 전달은 오버 헤드를 실행에 추가합니다. 즉, 코드를 빠르게 실행하려면 스레딩 패키지를 사용하는 것이 좋지 않은 경우가 종종 있습니다.

    파이썬은 진정한 의미의 멀티 스레딩을 허용하지 않습니다. 그것은 멀티 스레딩 패키지를 가지고 있지만 코드 속도를 높이기 위해 멀티 스레드를 원한다면 일반적으로 사용하지 않는 것이 좋습니다. 파이썬에는 GIL (Global Interpreter Lock)이라는 구조가 있습니다. GIL은 한 번에 하나의 '스레드'만 실행할 수 있도록합니다. 쓰레드가 GIL을 얻고, 약간의 작업을 한 다음, GIL을 다음 쓰레드로 넘깁니다. 이것은 매우 빠르게 발생하므로 사용자의 스레드가 병렬로 실행되는 것처럼 보일 수 있지만 실제로는 동일한 CPU 코어를 사용하여 순서를 바꾸고 있습니다. 이 모든 GIL 전달은 오버 헤드를 실행에 추가합니다. 즉, 코드를 빠르게 실행하려면 스레딩 패키지를 사용하는 것이 좋지 않은 경우가 종종 있습니다.

    파이썬의 스레딩 패키지를 사용해야하는 이유가 있습니다. 동시에 어떤 것을 실행하기를 원하고 효율성이 문제가되지 않는다면 완전히 편리하고 편리합니다. 또는 (IO와 같이) 뭔가를 기다려야하는 코드를 실행하는 경우에는 많은 의미를 가질 수 있습니다. 그러나 스레딩 라이브러리는 여분의 CPU 코어를 사용할 수 없습니다.

    멀티 스레딩은 다중 처리를 통해 운영 체제에 아웃소싱 할 수 있으며 Python 코드 (예 : Spark 또는 Hadoop)를 호출하는 외부 응용 프로그램이나 Python 코드에서 호출하는 일부 코드 (예 : Python 코드 비싼 멀티 스레드 물건을 않는 C 함수를 호출).

  6. ==============================

    6.Visual Effects에 대한 책 멀티 스레딩의 예제를 공유하고자합니다. 그래서 고전적인 데드 록 상황이 있습니다.

    Visual Effects에 대한 책 멀티 스레딩의 예제를 공유하고자합니다. 그래서 고전적인 데드 록 상황이 있습니다.

    static void MyCallback(const Context &context){
    Auto<Lock> lock(GetMyMutexFromContext(context));
    ...
    EvalMyPythonString(str); //A function that takes the GIL
    ...    
    }
    

    이제 데드 록을 초래하는 순서의 이벤트를 고려하십시오.

    ╔═══╦════════════════════════════════════════╦══════════════════════════════════════╗
    ║   ║ Main Thread                            ║ Other Thread                         ║
    ╠═══╬════════════════════════════════════════╬══════════════════════════════════════╣
    ║ 1 ║ Python Command acquires GIL            ║ Work started                         ║
    ║ 2 ║ Computation requested                  ║ MyCallback runs and acquires MyMutex ║
    ║ 3 ║                                        ║ MyCallback now waits for GIL         ║
    ║ 4 ║ MyCallback runs and waits for MyMutex  ║ waiting for GIL                      ║
    ╚═══╩════════════════════════════════════════╩══════════════════════════════════════╝
    
  7. ==============================

    7.파이썬 (CPython 및 다른 사람들)이 GIL을 사용하는 이유

    파이썬 (CPython 및 다른 사람들)이 GIL을 사용하는 이유

    http://wiki.python.org/moin/GlobalInterpreterLock에서

    CPython에서 전역 인터프리터 잠금 또는 GIL은 다중 네이티브 스레드가 Python 바이트 코드를 한 번에 실행할 수 없게하는 뮤텍스입니다. 이 잠금은 CPython의 메모리 관리가 스레드로부터 안전하지 않기 때문에 주로 필요합니다.

    파이썬에서 그것을 제거하는 방법?

    루아와 마찬가지로 파이썬은 여러 VM을 시작할 수 있지만 파이썬은 그렇게하지 않습니다. 다른 이유가있을 것입니다.

    Numpy 나 다른 파이썬 확장 라이브러리에서 GIL을 다른 스레드로 릴리스하면 전체 프로그램의 효율성을 높일 수 있습니다.

  8. from https://stackoverflow.com/questions/1294382/what-is-the-global-interpreter-lock-gil-in-cpython by cc-by-sa and MIT license