RSS DEV 커뮤니티
팔로우
Python ORM을 Rust 엔진으로 구축했습니다 — GIL, PyO3, asyncio가 실제로 어떻게 협력하는지 알려드립니다
Yara-orm은 Python을 위한 새로운 비동기 ORM으로, Django 스타일의 모델 인터페이스를 제공하지만 Rust 기반 엔진을 사용하여 읽기 성능을 향상시킵니다. 핵심 혁신은 Python의 단일 스레드 asyncio 이벤트 루프와 Rust의 Tokio 멀티 스레드 런타임을 결합한 듀얼 런타임 아키텍처에 있습니다. 이 설정은 Python의 I/O 작업과 데이터베이스 작업 간의 차단을 방지하는 것을 목표로 합니다.전역 인터프리터 잠금(GIL)은 Python 객체와 상호 작용할 때 Rust 코드에서 명시적인 처리를 요구하는 과제를 제시합니다. Yara-orm은 매개변수 바인딩(Python에서 Rust로) 및 행 디코딩(Rust에서 Python으로) 중에만 GIL을 획득하여 이를 관리합니다. 연결 풀링 및 쿼리 실행을 포함한 Rust 데이터베이스 엔진은 GIL이 해제된 상태로 작동하여 다른 Python 작업이 동시에 실행될 수 있도록 합니다.이러한 런타임 간에 전달되는 데이터는 소유권을 가지며 스레드 간 안전을 보장하기 위해 Send되어야 합니다. Rust future는 pyo3-async-runtimes를 사용하여 Python awaitable로 변환되어 Python의 asyncio 루프와 원활하게 통합됩니다. Rust future가 Tokio 작업자 스레드에서 완료되면 해당 결과는 처리를 위해 asyncio 루프로 다시 예약됩니다.이 아키텍처는 asyncio 이벤트 루프가 데이터베이스 I/O에 의해 차단되지 않도록 하고, 데이터베이스 I/O가 GIL을 보유하지 않도록 합니다. 성능 최적화는 행당 발생하며 ORM 속도의 중요한 요소인 행 디코딩 프로세스에 집중됩니다. 이러한 최적화에는 효율적인 유형 처리 및 빠른 데이터 변환을 위한 디스패치 메커니즘이 포함됩니다.동기 드라이버를 사용하는 SQLite의 경우, 분리 원칙을 유지하기 위해 전용 차단 스레드 풀이 사용됩니다. GIL을 보유하는 직접 변환과 직렬화 접근 방식(예: MessagePack) 간의 선택은 절충안으로 제시됩니다. Yara-orm은 일반적인 단일 이벤트 루프 비동기 Python 서비스에 더 나은 성능을 제공한다고 믿고 직접 변환을 선택합니다.이 프로젝트는 pip를 통해 설치할 수 있으며 GitHub 저장소 및 문서에 대한 링크를 제공합니다. 작성자는 또한 유사한 PyO3 브리지를 구축한 다른 개발자들의 통찰력을 구하고 있습니다.