Skip to main content

Scope

Struct Scope 

Source
pub struct Scope<'scope> { /* private fields */ }
Expand description

A scope to spawn scoped shared tasks in.

§The difference between Scope and LocalScope

The Scope works with shared tasks and its tasks can be shared between threads.

Read Executor for more details.

See shared_scope for details.

Implementations§

Source§

impl<'scope> Scope<'scope>

Source

pub fn exec<F: Future<Output = ()> + Send>(&'scope self, future: F)

Executes a new shared task within a scope.

Unlike non-scoped tasks, tasks created with this function may borrow non-'static data from the outside the scope. See shared_scope for details.

The created task will be executed immediately.

§Example
use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
use std::time::Duration;
use orengine::sleep;
use orengine::sync::{shared_scope, AsyncWaitGroup, WaitGroup};

let wg = WaitGroup::new();
let a = AtomicUsize::new(0);

shared_scope(|scope| async {
    for i in 0..10 {
        wg.inc();
        scope.exec(async {
            assert_eq!(a.load(SeqCst), i);
            a.fetch_add(1, SeqCst);
            sleep(Duration::from_millis(i as u64)).await;
            wg.done();
        });
    }

    wg.wait().await;
    assert_eq!(a.load(SeqCst), 10);
}).await;

assert_eq!(a.load(SeqCst), 10);
Source

pub fn spawn<F: Future<Output = ()> + Send>(&'scope self, future: F)

Spawns a new shared task within a scope.

Unlike non-scoped tasks, tasks created with this function may borrow non-'static data from the outside the scope. See shared_scope for details.

The created task will be executed later.

§Example
use std::sync::atomic::{AtomicUsize, Ordering::SeqCst};
use orengine::sync::{shared_scope, AsyncWaitGroup, WaitGroup};

let wg = WaitGroup::new();
let a = AtomicUsize::new(0);

shared_scope(|scope| async {
    for i in 0..10 {
        wg.inc();
        scope.spawn(async {
            a.fetch_add(1, SeqCst);
            wg.done();
        });
    }

    assert_eq!(a.load(SeqCst), 0);
    wg.wait().await;
    assert_eq!(a.load(SeqCst), 10);
}).await;

assert_eq!(a.load(SeqCst), 10);

Trait Implementations§

Source§

impl Send for Scope<'_>

Source§

impl Sync for Scope<'_>

Auto Trait Implementations§

§

impl<'scope> !Freeze for Scope<'scope>

§

impl<'scope> RefUnwindSafe for Scope<'scope>

§

impl<'scope> Unpin for Scope<'scope>

§

impl<'scope> UnsafeUnpin for Scope<'scope>

§

impl<'scope> UnwindSafe for Scope<'scope>

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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.