Kesimpulan (Conclusion)
Ketidakmampuan PyO3 untuk langsung mengekspos struct yang menggunakan lifetime Rust ke Python mungkin pada awalnya terlihat seperti keterbatasan. Namun, pustaka standar Rust dan PyO3 menyediakan alat-alat yang kuat untuk mengatasi keterbatasan ini. std::mem::take dan std::mem::replace memungkinkan penanganan referensi yang dapat diubah (mutable reference) dan nilai yang dimiliki (owned value) dengan terampil, sementara Arc dan Mutex sangat berguna untuk mengekspos data bersama yang dapat diubah ke Python. Secara khusus, MutexExt dari PyO3 adalah alat penting untuk mencegah deadlock saat menggunakan mutex bersama Python.
Ringkasan poin utama
Dokumen ini menjelaskan langkah demi langkah masalah teknis yang ditemui dan proses penyelesaiannya saat berbagi data yang dapat diubah (mutable) antara Rust dan Python dalam proyek yang mengimplementasikan ulang bahasa template Django ke Rust.
-
Latar belakang: Bahasa template Django menggunakan objek bernama
contextuntuk menyediakan data dinamis ke template. Dalam implementasi Rust pada proyek ini,contextdidefinisikan sebagai struct Rust, dan harus diteruskan sebagai referensi yang dapat diubah (&mut Context) saat merender tag template. -
Masalah awal: Referensi yang dapat diubah (
&mut Context) dari kode Rust perlu diteruskan ke fungsi Python untuk menjalankan custom tag. Namun, Python tidak memahami lifetime Rust, dan PyO3, pustaka integrasi Rust-Python, memerlukan nilai yang dimiliki (owned value), sehingga meneruskan referensi secara langsung akan memicu error kompilasi. -
Proses penyelesaian:
- Menyelesaikan masalah kepemilikan: Menggunakan
std::mem::takeuntuk sementara mengambil kepemilikan dari&mut Contextdan membuat objekContextyang dimiliki sehingga bisa diteruskan ke Python. Setelah kode Python dijalankan, dilakukan percobaan untuk mengembalikanContextyang telah diproses ke posisi referensi asal denganstd::mem::replace. - Menyelesaikan error 'Moved Value': Namun dalam proses ini, saat mencoba menggunakan kembali objek
Contextsetelah dipindahkan (move) ke fungsi Python, muncul error kompilasi "use of moved value". Untuk mengatasinya, diperkenalkanArc(Atomic Reference Count) untuk membungkusContext. Dengan cara ini, referensi hasil salinan (clone) dapat diteruskan ke Python tanpa memindahkan kepemilikan. - Menangani saat Python mempertahankan referensi: Jika Python terus mempertahankan referensi ke
Context, pemulihan kepemilikan melaluiArc::try_unwrapbisa gagal. Dalam kasus ini, dataContextdiduplikasi dengan mengimplementasikan metode fallback seperticlone_refyang melakukan deep clone pada data internal. - Mengizinkan perubahan data dari Python: Pada akhirnya, agar kode Python tidak hanya membaca
Contexttetapi juga bisa mengubahnya, diperkenalkanMutex. Dengan menggunakan strukturArc<Mutex<Context>>, akses dan modifikasi data dijamin aman di banyak thread. Pada saat ini, untuk mencegah deadlock dengan interpreter Python, digunakan metodelock_py_attacheddariMutexExtyang disediakan PyO3.
- Menyelesaikan masalah kepemilikan: Menggunakan
Belum ada komentar.