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>
impl<'scope> Scope<'scope>
Sourcepub fn exec<F: Future<Output = ()> + Send>(&'scope self, future: F)
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);Sourcepub fn spawn<F: Future<Output = ()> + Send>(&'scope self, future: F)
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§
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more