Release the GIL during evaluation, and decide on free-threaded (cp314t) support
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 42/100
Piste de recherche
Commencez par evaluate() et Program.execute(), puis exécutez compile_execute_benchmark.py afin de mesurer le surcoût de detach/attach par rapport au seuil indiqué. Auditez Context, la stdlib Env partagée et le cache par-Context pour vérifier leur sûreté en mode free-threaded, et examinez la matrice CI de maturin-action. Le travail est considéré comme terminé lorsque l’évaluation concurrente est couverte par des tests, que le choix de la libération du GIL a été évalué par benchmark et que des wheels cp314t sont incluses si elles sont prises en charge.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Problem
evaluate() and Program.execute() hold the GIL for the entire Rust-side evaluation. A Python program that evaluates CEL from several threads therefore serialises on the interpreter even though the work is pure Rust once the context has been converted. This matters for the policy-engine style of use (many rules × many requests) that the README leads with.
Proposal
- Release the GIL around
program.execute()withpy.detach(|| ...)(PyO3 0.29's spelling ofallow_threads). The pieces already have the right bounds:cel::Programis a plain AST,cel::Context<'static>isSend + Sync(itsVal,FunctionandVariableResolvertraits all require it), and the Python-callback wrappers already do their ownPython::attach, so a callback simply re-acquires the GIL when it runs. Conversion of the result back to Python happens after re-attaching. - Measure the fixed cost. Detach/attach is on the order of tens of nanoseconds, but a trivial
x + yexecutes in ~0.15 µs, so unconditional detaching could be a visible relative slowdown for tiny expressions while being a large absolute win for anything heavier or for multi-threaded callers. Options, in order of preference:- detach unconditionally if the overhead measures under ~10% on the
compile_execute_benchmark.pycases; - otherwise detach only when the context has no Python functions and no resolver (that's when the evaluation cannot need the GIL), which is cheap to know from the
Context; - an explicit
execute(ctx, release_gil=...)knob is a last resort.
- detach unconditionally if the overhead measures under ~10% on the
- Free-threaded Python. PyO3 0.29 supports the free-threaded build when the module opts in with
#[pymodule(gil_used = false)]. Before doing that, audit:Contextmutators are&mut self(PyO3's borrow checker turns concurrent mutation into an error rather than a data race), the shared stdlibEnvis aLazyLock, and the per-Contextcache proposed in the Context-reuse PR is behind aMutex. Then addcp314twheels to the CI matrix (maturin-action needs the interpreter listed explicitly;--find-interpreterwon't pick it up).
Non-goals
Context itself is documented as not thread-safe for concurrent mutation; that stays. Concurrent evaluation against a shared Context is already fine and is now pinned by tests.
- Langage dominant
- Python
- Étoiles
- 43
- Forks
- 4
- Merge moyen
- 12 h 37 min
- PR mergées (30 j)
- 11
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de hardbyte/python-common-expression-language
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
hardbyte/python-common-expression-language#47 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
hardbyte/python-common-expression-language#57 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
hardbyte/python-common-expression-language#50 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
hardbyte/python-common-expression-language#49 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 45/100
hardbyte/python-common-expression-language#48 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de hardbyte/python-common-expression-language
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
FuRongJun-1999/dsh-memory#65 ·
Les mainteneurs répondent en général sous 1 jour
-
ci needs-ac
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Ikalus1988/MisakaNet#2930 ·
Les mainteneurs répondent en général sous 1 jour
-
`FakeBackendV2.run` fails with `NoiseError` on circuits with delays on qubits where T2 > 2·T1Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Qiskit/qiskit-aer#2466 ·
-
area/cli
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100