찾다

 >  Q&A  >  본문

cpython引入GIL的目的到底是什么,求详解?

查了很多资料,这些资料基本直说到GIL会让是字节码只让一个线程执行,但是为什么要这么做的原因,都感觉没说的很彻底。所以想请高人解惑!!

PHP中文网PHP中文网2810일 전734

모든 응답(2)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-17 16:19:33

    Python의 아버지의 대화 중 일부에서 몇 가지 트릭을 볼 수 있습니다.

    일부 청취자들은 GIL(Global Interpreter Lock)에 대해 질문했고 이 문제와 해결 방법에 대해 더 알고 싶어했습니다. Van Rossum은 미소를 지으며 "시간이 얼마나 남았나요?"라고 물었고 그는 GIL의 역사를 간략하게 말했습니다. Python이 탄생한 후 멀티 코어 컴퓨터가 등장했습니다. 스레드가 서로 다른 코어에서 실행되는 경우, 특히 Python 가비지 수집 메커니즘에서 두 개 이상의 프로세서가 동일한 개체를 업데이트하려고 할 때 경쟁 메커니즘이 발생합니다.

    합리적인 해결책은 각 개체를 잠그는 것입니다. 이렇게 하면 여러 번 액세스하여 데이터가 손상되는 것을 방지할 수 있습니다. 그러나 결과적으로 잠금에 대한 경합이 없을 때 잠금 및 잠금 해제 작업에는 비용이 많이 듭니다. 일부 실험에서는 잠금이 필요하지 않은 단일 스레드 프로그램의 성능이 2배 감소하는 것으로 나타났습니다. 즉, 3개 이상의 스레드나 코어를 사용하는 프로그램만 이 혜택을 누릴 수 있습니다.

    그래서 GIL이 탄생했습니다(비록 이름은 통역사에 추가된 지 한참이 지나서야 나타나지만). 모든 객체에 대한 액세스가 순서대로 이루어지도록 모든 객체를 동시에 효과적으로 잠그는 단일 잠금입니다. 이제 문제는 10년 또는 15년 안에 멀티 코어 프로세서가 어디에나 있게 될 것이며 사람들은 멀티 프로세싱(예: 스레드 통신 대신 독립 프로세스 사용)을 수행하지 않고도 이를 활용하기를 원할 것이라는 점입니다.

    그는 오늘날 새로운 언어를 디자인하고 싶다면 변경 가능한 객체가 없거나 제한된 변경 가능성을 갖도록 만들어야 한다고 말했습니다. 그러나 청중으로부터는 "이것은 더 이상 Python이 아니다"라는 반응이 나왔습니다. "내가 할 말을 당신이 말했군요." Van Rossum이 동의했습니다. PyPy Software Transactional Memory(STM) 및 PyParallel을 포함하여 GIL을 중심으로 개발자들이 지속적인 노력을 기울이고 있습니다. 다른 개발자들도 해결책을 찾기 위해 머리를 긁적입니다. GIL을 제거하고 Pythonic 언어를 유지하는 방법을 아는 사람이 있다면 Van과 다른 사람들도 이에 대해 듣고 싶어할 것입니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 16:19:33

    잠금의 입도가 작을수록 구현이 복잡해지고 잠금으로 인해 성능이 저하될 수 있으므로 전역 대형 잠금을 추가합니다.

    회신하다
    0
  • 취소회신하다