Struct Scope

struct Scope<'scope> { ... }

Represents a fork-join scope which can be used to spawn any number of tasks. See scope() for more information.

Implementations

impl<'scope> Scope<'scope>

fn spawn<BODY>(self: &Self, body: BODY)
where
    BODY: FnOnce(&Scope<'scope>) + Send + 'scope

Spawns a job into the fork-join scope self. This job will execute sometime before the fork-join scope completes. The job is specified as a closure, and this closure receives its own reference to the scope self as argument. This can be used to inject new jobs into self.

Returns

Nothing. The spawned closures cannot pass back values to the caller directly, though they can write to local variables on the stack (if those variables outlive the scope) or communicate through shared channels.

(The intention is to eventually integrate with Rust futures to support spawns of functions that compute a value.)

Examples

# use rayon_core as rayon;
let mut value_a = None;
let mut value_b = None;
let mut value_c = None;
rayon::scope(|s| {
    s.spawn(|s1| {
          // ^ this is the same scope as `s`; this handle `s1`
          //   is intended for use by the spawned task,
          //   since scope handles cannot cross thread boundaries.

        value_a = Some(22);

        // the scope `s` will not end until all these tasks are done
        s1.spawn(|_| {
            value_b = Some(44);
        });
    });

    s.spawn(|_| {
        value_c = Some(66);
    });
});
assert_eq!(value_a, Some(22));
assert_eq!(value_b, Some(44));
assert_eq!(value_c, Some(66));

See also

The scope function has more extensive documentation about task spawning.

fn spawn_broadcast<BODY>(self: &Self, body: BODY)
where
    BODY: Fn(&Scope<'scope>, BroadcastContext<'_>) + Send + Sync + 'scope

Spawns a job into every thread of the fork-join scope self. This job will execute on each thread sometime before the fork-join scope completes. The job is specified as a closure, and this closure receives its own reference to the scope self as argument, as well as a BroadcastContext.

impl<'scope> Debug for Scope<'scope>

fn fmt(self: &Self, fmt: &mut Formatter<'_>) -> Result

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

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

impl<'scope> Send for Scope<'scope>

impl<'scope> Sync for Scope<'scope>

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

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

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

impl<T> Any for Scope<'scope>

fn type_id(self: &Self) -> TypeId

impl<T> Borrow for Scope<'scope>

fn borrow(self: &Self) -> &T

impl<T> BorrowMut for Scope<'scope>

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

impl<T> From for Scope<'scope>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> Pointable for Scope<'scope>

unsafe fn init(init: <T as Pointable>::Init) -> usize
unsafe fn deref<'a>(ptr: usize) -> &'a T
unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T
unsafe fn drop(ptr: usize)

impl<T, U> Into for Scope<'scope>

fn into(self: Self) -> U

Calls U::from(self).

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

impl<T, U> TryFrom for Scope<'scope>

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

impl<T, U> TryInto for Scope<'scope>

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