Я создал Python ORM с движком ... Заметка
DEV Community на русском

Я создал Python ORM с движком на Rust — вот как GIL, PyO3 и asyncio на самом деле взаимодействуют

Yara-orm — это новая асинхронная ORM, разработанная для Python, предлагающая интерфейс моделей в стиле Django, но с движком на основе Rust для повышения производительности чтения. Основная инновация заключается в архитектуре с двойным временем выполнения, сочетающей однопоточный цикл событий asyncio в Python с многопоточным временем выполнения Tokio в Rust. Эта конфигурация призвана предотвратить блокировку между операциями ввода-вывода Python и операциями базы данных.Глобальная блокировка интерпретатора (GIL) представляет собой проблему, требующую явной обработки в коде Rust при взаимодействии с объектами Python. Yara-orm управляет этим, захватывая GIL только во время привязки параметров (Python к Rust) и декодирования строк (Rust к Python). Движок базы данных Rust, включая пул соединений и выполнение запросов, работает с освобожденной GIL, позволяя другим задачам Python выполняться параллельно.Данные, передаваемые между этими средами выполнения, являются собственными и должны быть Send для обеспечения безопасности между потоками. Rust-фьючерсы преобразуются в Python awaitables с использованием pyo3-async-runtimes, беспрепятственно интегрируясь с циклом asyncio в Python. Когда Rust-фьючерс завершается в рабочем потоке Tokio, его результат планируется обратно в цикл asyncio для обработки.Эта архитектура гарантирует, что цикл событий asyncio не будет заблокирован операциями ввода-вывода базы данных, а операции ввода-вывода базы данных никогда не будут удерживать GIL. Оптимизация производительности сосредоточена на процессе декодирования строк, который происходит для каждой строки и является значительным фактором скорости ORM. Эти оптимизации включают эффективную обработку типов и механизмы диспетчеризации для более быстрого преобразования данных.Для SQLite, который использует синхронный драйвер, используется выделенный пул блокирующих потоков для поддержания принципа разделения. Выбор между прямым преобразованием с удержанием GIL и подходом сериализации (например, MessagePack) представлен как компромисс. Yara-orm выбирает прямое преобразование, полагая, что оно обеспечивает лучшую производительность для типичных асинхронных Python-сервисов с одним циклом событий.Проект доступен для установки через pip и предоставляет ссылки на свой репозиторий GitHub и документацию. Автор также ищет мнения других разработчиков, которые создали аналогичные мосты PyO3.