pyo3::sync

Struct GILProtected

Source
pub struct GILProtected<T> { /* private fields */ }
Expand description

Value with concurrent access protected by the GIL.

This is a synchronization primitive based on Python’s global interpreter lock (GIL). It ensures that only one thread at a time can access the inner value via shared references. It can be combined with interior mutability to obtain mutable references.

§Example

Combining GILProtected with RefCell enables mutable access to static data:

use pyo3::sync::GILProtected;
use std::cell::RefCell;

static NUMBERS: GILProtected<RefCell<Vec<i32>>> = GILProtected::new(RefCell::new(Vec::new()));

Python::with_gil(|py| {
    NUMBERS.get(py).borrow_mut().push(42);
});

Implementations§

Source§

impl<T> GILProtected<T>

Source

pub const fn new(value: T) -> Self

Place the given value under the protection of the GIL.

Source

pub fn get<'py>(&'py self, _py: Python<'py>) -> &'py T

Gain access to the inner value by giving proof of having acquired the GIL.

Source

pub fn traverse<'py>(&'py self, _visit: PyVisit<'py>) -> &'py T

Gain access to the inner value by giving proof that garbage collection is happening.

Trait Implementations§

Source§

impl<T> Sync for GILProtected<T>
where T: Send,

Auto Trait Implementations§

§

impl<T> Freeze for GILProtected<T>
where T: Freeze,

§

impl<T> RefUnwindSafe for GILProtected<T>
where T: RefUnwindSafe,

§

impl<T> Send for GILProtected<T>
where T: Send,

§

impl<T> Unpin for GILProtected<T>
where T: Unpin,

§

impl<T> UnwindSafe for GILProtected<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Ungil for T
where T: Send,