mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-15 23:31:29 +00:00
pyo3 0.23.5 hard-caps the interpreter at Python 3.13, so building the native bridge against a 3.14 interpreter aborts inside pyo3-ffi's build script before anything links. This raises pyo3 and pyo3-async-runtimes to 0.29 (currently the newest line, and the range starting at 0.26 that supports 3.14) and migrates the three call sites whose APIs were renamed across that range: Python::with_gil is now Python::attach and Python::allow_threads is now Python::detach. On a GIL-enabled interpreter those are pure renames with identical semantics, so behavior on 3.10 through 3.13 is unchanged Verified by compiling the native module for cp313 and cp314 and driving it directly on both interpreters: gil_stats reports exactly one GIL release per sync OCR call and the async path completes, matching the 0.23.5 baseline. cargo fmt, clippy, and the workspace tests pass on both 3.13 and 3.14 with the lockfile locked, and the lock churn is confined to the pyo3 crates Part of #26343; addresses the pyo3 build failure reported in #33116
32 lines
1.1 KiB
Rust
32 lines
1.1 KiB
Rust
//! GIL accounting.
|
|
//!
|
|
//! A single chokepoint for releasing the GIL around blocking work. Every
|
|
//! blocking call in the bridge goes through [`release_gil`] instead of calling
|
|
//! `Python::detach` directly, so the release count stays accurate and we
|
|
//! have one place to extend later (timing histograms, per-call labels, etc.).
|
|
|
|
use std::sync::atomic::{AtomicU64, Ordering};
|
|
|
|
use pyo3::prelude::*;
|
|
|
|
/// Number of times the bridge has released the GIL since process start.
|
|
static GIL_RELEASES: AtomicU64 = AtomicU64::new(0);
|
|
|
|
/// Release the GIL around `f`, recording the release.
|
|
///
|
|
/// `f` must not touch any Python state — that is what makes releasing the GIL
|
|
/// safe. Returning the value back to Python re-acquires the GIL at the call
|
|
/// site, after `f` has finished.
|
|
pub fn release_gil<T, F>(py: Python<'_>, f: F) -> T
|
|
where
|
|
F: FnOnce() -> T + Send,
|
|
T: Send,
|
|
{
|
|
GIL_RELEASES.fetch_add(1, Ordering::Relaxed);
|
|
py.detach(f)
|
|
}
|
|
|
|
/// Total GIL releases performed by the bridge so far.
|
|
pub fn release_count() -> u64 {
|
|
GIL_RELEASES.load(Ordering::Relaxed)
|
|
}
|