찾다
백엔드 개발파이썬 튜토리얼Python GIL 없이 고성능 멀티스레딩을 위한 관문

소개

Python은 사용하기 쉽고 다재다능한 것으로 오랫동안 알려져 왔습니다. 그러나 Python 커뮤니티에서 많은 논의를 불러일으킨 주제 중 하나는 GIL(Global Interpreter Lock)입니다. GIL은 Python의 동시성 모델, 특히 여러 CPU 코어를 활용할 수 있는 CPU 바인딩 작업에 대한 보호 장치이자 병목 현상이었습니다. 그러나 Python 3.13이 출시되면서 Python 개발자는 GIL을 비활성화하는 기능이라는 획기적인 새 옵션을 갖게 되었습니다. 이 블로그에서는 GIL이 무엇인지, 멀티스레딩 성능에 장애물이 된 이유, 진정한 멀티스레딩 성능을 잠금 해제하기 위해 Python 3.13에서 GIL을 감지하고 비활성화하는 방법을 살펴보겠습니다.

GIL(Global Interpreter Lock)이란 무엇입니까?

GIL(Global Interpreter Lock)은 Python 객체에 대한 액세스를 보호하는 뮤텍스로, 여러 네이티브 스레드가 Python 바이트코드를 동시에 실행하지 못하도록 방지합니다. 이는 Python 프로그램의 스레드 안전성을 보장하지만 동시 실행 비용이 발생합니다. GIL은 I/O 바인딩 작업에 대해 Python 스레드를 더 효율적으로 만들지 만 CPU 바인딩 작업에 대한 성능을 제한합니다.

GIL이 멀티스레딩에 병목 현상을 일으키는 이유

Python의 GIL을 사용하면 다중 스레드 프로그램에서도 하나의 스레드만 동시에 실행할 수 있습니다. 이는 프로그램이 입력/출력 작업을 기다리는 I/O 중심 작업에는 문제가 없지만 숫자 처리, 데이터 분석 또는 이미지 처리와 같은 CPU 중심 작업의 성능을 심각하게 제한합니다.

Python 3.13: GIL을 비활성화한 상태에서 멀티스레딩 잠금 해제

Python 3.13을 사용하면 개발자는 Python 빌드 프로세스 중에 GIL을 비활성화할 수 있습니다. 그러나 사전 빌드된 Python 배포판에서는 GIL을 비활성화할 수 없습니다. 대신 --disable-gil 옵션을 사용하여 소스에서 Python 3.13을 컴파일해야 합니다.

이 새로운 옵션은 CPU 바인딩된 멀티스레드 작업에서 진정한 병렬 처리의 문을 열어 스레드가 여러 코어에서 병렬로 실행될 수 있게 해줍니다.

GIL 없이 Python 3.13을 사용하기 위한 전제 조건

  • Python 3.13 소스 코드: 사전 빌드된 표준 바이너리에서는 GIL을 비활성화할 수 없습니다. --disable-gil 플래그를 사용하여 소스에서 Python 3.13을 빌드해야 합니다.
  • 멀티 코어 CPU: 이제 스레드가 여러 코어에서 병렬로 실행되므로 진정한 멀티스레딩의 이점을 활용하려면 멀티 코어 CPU가 필요합니다.

GIL을 비활성화한 상태에서 Python 3.13 컴파일하기

-X gil=0 플래그를 사용하여 GIL을 비활성화하려면 --disable-gil 플래그를 활성화하여 소스에서 Python을 컴파일해야 합니다. 방법은 다음과 같습니다

단계별

  • Python 3.13 소스 코드 다운로드 먼저 공식 Python 웹사이트에서 Python 3.13 소스 코드 tarball을 다운로드해야 합니다. 이는 미리 빌드된 바이너리(python.org에서 직접 다운로드한 것과 같은)가 GIL 비활성화를 지원하도록 컴파일되지 않았기 때문입니다. 웹 브라우저를 사용하거나 wget을 사용하거나 터미널에서 컬을 사용하여 다운로드할 수 있습니다.
wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz
  • 소스 추출:
tar -xf Python-3.13.0.tgz
cd Python-3.13.0
  • --disable-gil을 사용하여 빌드 구성 GIL 비활성화 옵션을 지원하려면 --disable-gil을 사용하여 Python을 구성해야 합니다.
./configure --disable-gil
  • Python 컴파일 및 설치:
make
sudo make altinstall 
  • altinstall 단계가 실패하면 --prefix를 사용하여 구성 명령을 다시 실행하세요.
./configure --disable-gil --prefix=$HOME/python3.13
  • 지정된 디렉터리에서 make altinstall을 실행하세요. 그런 다음 make altinstall 명령을 실행하십시오.
make altinstall

Python 3.13에서 GIL을 감지하는 방법

Python 3.13에서는 sys._is_gil_enabled() 함수를 사용하여 GIL의 활성화 또는 비활성화 여부를 확인할 수 있습니다.

import sys

def check_gil_status():
    if sys.version_info >= (3, 13):
        status = sys._is_gil_enabled()
        if status:
            print("GIL is currently enabled.")
        else:
            print("GIL is currently disabled.")
    else:
        print("Python version does not support GIL status detection.")

check_gil_status()

실습: GIL과 GIL-Free를 사용한 Python 멀티스레딩

다음 Python 코드는 Python 3.13에서 GIL을 비활성화할 때의 성능 향상을 평가하기 위해 개발되었습니다. 스크립트는 8개의 스레드를 동시에 실행하며, 각 스레드는 큰 숫자의 소인수 계산을 담당합니다. 진정한 병렬성을 활용함으로써 코드는 GIL 없이 달성된 향상된 성능을 강조합니다.

#!/usr/bin/env python3
import sys
import sysconfig
import time
from threading import Thread
from multiprocessing import Process


# Decorator to measure execution time of functions
def calculate_execution_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        result = func(*args, **kwargs)
        end_time = time.perf_counter()
        execution_time = end_time - start_time
        print(f"{func.__name__} took {execution_time:.4f} seconds.")
        return result

    return wrapper


# Compute-intensive task: Iterative Fibonacci calculation
def compute_fibonacci(n):
    """Compute Fibonacci number for a given n iteratively."""
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a


# Single-threaded task execution
@calculate_execution_time
def run_single_threaded(nums):
    for num in nums:
        compute_fibonacci(num)


# Multi-threaded task execution
@calculate_execution_time
def run_multi_threaded(nums):
    threads = [Thread(target=compute_fibonacci, args=(num,)) for num in nums]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()


# Multi-processing task execution
@calculate_execution_time
def run_multi_processing(nums):
    processes = [Process(target=compute_fibonacci, args=(num,)) for num in nums]
    for process in processes:
        process.start()
    for process in processes:
        process.join()


# Main execution function
def main():
    # Check Python version and GIL status for Python 3.13+
    print(f"Python Version: {sys.version}")

    py_version = float(".".join(sys.version.split()[0].split(".")[:2]))
    status = sysconfig.get_config_var("Py_GIL_DISABLED")

    if py_version >= 3.13:
        status = sys._is_gil_enabled()

    if status is None:
        print("GIL cannot be disabled for Python 



<h2>
  
  
  분석:
</h2>



<pre class="brush:php;toolbar:false">## Python 3.13 with GIL Disabled
Python Version: 3.13.0 experimental free-threading build (main, Oct 14 2024, 17:09:28) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL is currently disabled

Running Single-Threaded Task:
run_single_threaded took 8.6587 seconds.

Running Multi-Threaded Task:
run_multi_threaded took 1.3885 seconds.

Running Multi-Processing Task:
run_multi_processing took 1.5953 seconds.

## Python 3.13 with GIL Enabled
Python Version: 3.13.0 experimental free-threading build (main, Oct 14 2024, 17:09:28) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL is currently active

Running Single-Threaded Task:
run_single_threaded took 8.7108 seconds.

Running Multi-Threaded Task:
run_multi_threaded took 8.6645 seconds.

Running Multi-Processing Task:
run_multi_processing took 1.4530 seconds.

## Python 3.12 
Python Version: 3.12.6 (main, Sep  7 2024, 19:30:10) [Clang 14.0.0 (clang-1400.0.29.202)]
GIL cannot be disabled for Python 



<p><strong>멀티 스레드 성능:</strong> GIL 비활성화의 실제 이점은 멀티 스레드 시나리오에서 분명하게 드러납니다.</p>

<p>GIL이 비활성화된 경우(3.13) 실행 시간은 1.5703초입니다.<br>
GIL이 활성화된 경우(3.13) 실행 시간은 8.5901초입니다.<br>
결과: GIL을 비활성화하면 멀티스레드 작업의 성능이 약 81.7% 향상되었습니다.</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173615392355601.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Python The Gateway to High-Performance Multithreading Without GIL"></p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173615392486147.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Python The Gateway to High-Performance Multithreading Without GIL"></p>

<p>차트는 Python 3.13에서 GIL을 비활성화하면 멀티 스레드 CPU 바인딩 작업의 성능이 크게 향상되어 Python이 여러 CPU 코어를 병렬로 효율적으로 활용할 수 있음을 명확하게 보여줍니다. 단일 스레드 및 다중 처리 성능은 크게 영향을 받지 않지만 다중 스레드 성능은 상당한 개선을 보여 Python 3.13이 다중 스레딩에 의존하는 CPU 집약적 애플리케이션의 판도를 바꾸는 획기적인 제품이 되었습니다.</p><p>그러나 3.13 이전의 Python 버전은 GIL 비활성화를 지원하지 않습니다. 이는 다중 스레드 성능이 GIL이 활성화된 Python 3.13의 성능과 유사하게 유지되는 이유를 설명합니다. 이전 버전의 이러한 제한으로 인해 CPU 바인딩 작업에 대해 멀티스레딩을 완전히 활용하는 Python의 기능이 계속해서 제한됩니다.</p>

<h2>
  
  
  GIL을 비활성화하기 전 주요 고려 사항
</h2>

<p>Python 3.13에서 GIL(Global Interpreter Lock)을 비활성화하면 멀티 스레드 CPU 바인딩 작업에서 상당한 성능 향상을 얻을 수 있습니다. 그러나 그렇게 하기 전에 고려해야 할 몇 가지 중요한 요소가 있습니다:</p>

  • 스레드 안전성: GIL이 없으면 코드의 경합 상태를 방지하기 위해 잠금이나 기타 동기화 메커니즘을 사용하여 스레드 안전성을 수동으로 처리해야 합니다.

  • 잠재적 성능 저하: 세분화된 잠금은 경합을 야기할 수 있으며, 이로 인해 이전에 GIL의 이점을 누렸던 단일 스레드 또는 I/O 바인딩 작업의 성능이 저하될 수 있습니다.

  • 타사 라이브러리와의 호환성: 많은 C 확장 및 라이브러리는 스레드 안전을 위해 GIL이 있다고 가정합니다. GIL을 비활성화하면 이러한 라이브러리가 다중 스레드 환경에서 올바르게 작동하도록 업데이트해야 할 수도 있습니다.

  • 복잡한 메모리 관리: GIL을 비활성화하면 메모리 관리가 더욱 복잡해지며 스레드로부터 안전한 메모리 처리가 필요하므로 버그와 오류의 위험이 높아질 수 있습니다.

  • I/O 바인딩된 작업: GIL을 비활성화하면 asyncio와 같은 비차단 I/O 메커니즘이 더 효과적일 수 있는 I/O 바인딩 작업에 제한된 이점을 제공합니다.

  • 디버깅의 어려움: GIL이 없으면 경쟁 조건 및 교착 상태 가능성이 높아져 멀티스레드 애플리케이션 디버깅이 더욱 어려울 수 있습니다.

  • 더 높은 메모리 사용량: GIL 없이 잠금을 사용하고 스레드 상태를 관리하면 특히 멀티 스레드 애플리케이션에서 메모리 소비가 늘어날 수 있습니다.

  • 임베디드 시스템: GIL을 비활성화하면 Python과 임베디드 시스템의 멀티스레드 환경 통합이 복잡해질 수 있으며 효과적인 통합을 위해 더 많은 노력이 필요할 수 있습니다.

  • 잠금 경합: 경우에 따라 GIL을 비활성화하면 스레드 간 잠금 경합이 발생하여 예상되는 성능 향상이 줄어들 수 있습니다.

GitHub 저장소

내 GitHub의 이 블로그에서 예제의 전체 소스 코드를 찾을 수 있습니다.

Python GIL 성능 분석

부인 성명:

개인 블로그입니다. 여기에 표현된 견해와 의견은 작성자의 견해일 뿐이며 작성자와 직업적으로나 개인적으로 연관되어 있는 조직이나 개인의 견해와 의견을 대표하지 않습니다.

위 내용은 Python GIL 없이 고성능 멀티스레딩을 위한 관문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
파이썬과 시간 : 공부 시간을 최대한 활용파이썬과 시간 : 공부 시간을 최대한 활용Apr 14, 2025 am 12:02 AM

제한된 시간에 Python 학습 효율을 극대화하려면 Python의 DateTime, Time 및 Schedule 모듈을 사용할 수 있습니다. 1. DateTime 모듈은 학습 시간을 기록하고 계획하는 데 사용됩니다. 2. 시간 모듈은 학습과 휴식 시간을 설정하는 데 도움이됩니다. 3. 일정 모듈은 주간 학습 작업을 자동으로 배열합니다.

파이썬 : 게임, Guis 등파이썬 : 게임, Guis 등Apr 13, 2025 am 12:14 AM

Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

Python vs. C : 응용 및 사용 사례가 비교되었습니다Python vs. C : 응용 및 사용 사례가 비교되었습니다Apr 12, 2025 am 12:01 AM

Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

2 시간의 파이썬 계획 : 현실적인 접근2 시간의 파이썬 계획 : 현실적인 접근Apr 11, 2025 am 12:04 AM

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

파이썬 : 기본 응용 프로그램 탐색파이썬 : 기본 응용 프로그램 탐색Apr 10, 2025 am 09:41 AM

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 ​​같은 작업에 적합합니다.

2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?Apr 09, 2025 pm 04:33 PM

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.