Conclusion
Le fait que PyO3 ne puisse pas exposer directement à Python des structures utilisant les durées de vie (lifetime) de Rust peut sembler être une limitation au premier abord. Mais la bibliothèque standard de Rust et PyO3 fournissent des outils puissants pour la surmonter. std::mem::take et std::mem::replace permettent de manipuler habilement les références mutables (mutable reference) et les valeurs possédées (owned value), tandis que Arc et Mutex sont très utiles pour exposer à Python des données mutables partagées. En particulier, MutexExt de PyO3 est un outil indispensable pour éviter les interblocages lors de l’utilisation d’un mutex avec Python.
Résumé des points clés
Ce document explique pas à pas les problèmes techniques rencontrés et leur résolution lors du partage de données mutables entre Rust et Python dans un projet de réimplémentation en Rust du langage de templates de Django.
-
Contexte : le langage de templates de Django fournit des données dynamiques aux templates via un objet
context. Dans l’implémentation Rust du projet, cecontexta été défini comme une structure Rust, et il doit être transmis sous forme de référence mutable (&mut Context) lors du rendu des balises de template. -
Problème initial : il faut transmettre à une fonction Python la référence mutable (
&mut Context) du code Rust pour exécuter des balises personnalisées. Mais Python ne comprend pas les durées de vie de Rust et, comme PyO3 — la bibliothèque d’interfaçage Rust-Python — exige une valeur possédée (owned value), passer directement la référence provoque une erreur de compilation. -
Processus de résolution :
- Résoudre le problème de propriété : en utilisant
std::mem::take, on récupère temporairement la propriété depuis&mut Contextafin de créer un objetContextpossédé pouvant être transmis à Python. Après l’exécution du code Python, on tente de remettre leContexttraité à son emplacement de référence d’origine avecstd::mem::replace. - Résoudre l’erreur « moved value » : cependant, dans ce processus, lorsqu’on essaie de réutiliser l’objet
Contextaprès son déplacement (move) vers la fonction Python, l’erreur de compilation « use of moved value » se produit. Pour la résoudre, on introduitArc(Atomic Reference Count) pour encapsulerContext. Cela permet de transmettre à Python une référence clonée (clone) sans transférer la propriété. - Gestion du cas où Python conserve la référence : si Python continue de conserver une référence vers
Context, la récupération de la propriété viaArc::try_unwrappeut échouer. Dans ce cas, on met en place une méthode de repli commeclone_ref, qui effectue une copie profonde (deep clone) des données internes deContext. - Autoriser la modification des données depuis Python : enfin, pour que le code Python puisse non seulement lire
Contextmais aussi le modifier, on introduitMutex. La structureArc<Mutex<Context>>garantit un accès et une modification sûrs des données entre plusieurs threads. Pour éviter les interblocages avec l’interpréteur Python, on utilise alors la méthodelock_py_attacheddeMutexExtfournie par PyO3.
- Résoudre le problème de propriété : en utilisant
Aucun commentaire pour le moment.