pub struct Channel { /* private fields */ }
Expand description
Channel for scheduling Rust closures to execute on the JavaScript main thread.
Cloning a Channel
will create a new channel that shares a backing queue for
events.
§Example
The following example spawns a standard Rust thread to complete a computation and calls back to a JavaScript function asynchronously with the result.
fn async_fibonacci(mut cx: FunctionContext) -> JsResult<JsUndefined> {
// These types (`f64`, `Root<JsFunction>`, `Channel`) may all be sent
// across threads.
let n = cx.argument::<JsNumber>(0)?.value(&mut cx);
let callback = cx.argument::<JsFunction>(1)?.root(&mut cx);
let channel = cx.channel();
// Spawn a thread to complete the execution. This will _not_ block the
// JavaScript event loop.
std::thread::spawn(move || {
let result = fibonacci(n);
// Send a closure as a task to be executed by the JavaScript event
// loop. This _will_ block the event loop while executing.
channel.send(move |mut cx| {
let callback = callback.into_inner(&mut cx);
callback
.bind(&mut cx)
.args(((), result))?
.exec()?;
Ok(())
});
});
Ok(cx.undefined())
}
Implementations§
Source§impl Channel
impl Channel
Sourcepub fn new<'a, C: Context<'a>>(cx: &mut C) -> Self
pub fn new<'a, C: Context<'a>>(cx: &mut C) -> Self
Creates an unbounded channel for scheduling closures on the JavaScript main thread
Sourcepub fn unref<'a, C: Context<'a>>(&mut self, cx: &mut C) -> &mut Self
pub fn unref<'a, C: Context<'a>>(&mut self, cx: &mut C) -> &mut Self
Allow the Node event loop to exit while this Channel
exists.
Idempotent
Sourcepub fn reference<'a, C: Context<'a>>(&mut self, cx: &mut C) -> &mut Self
pub fn reference<'a, C: Context<'a>>(&mut self, cx: &mut C) -> &mut Self
Prevent the Node event loop from exiting while this Channel
exists. (Default)
Idempotent
Sourcepub fn send<T, F>(&self, f: F) -> JoinHandle<T> ⓘ
pub fn send<T, F>(&self, f: F) -> JoinHandle<T> ⓘ
Schedules a closure to execute on the JavaScript thread that created this Channel Panics if there is a libuv error
Trait Implementations§
Source§impl Clone for Channel
impl Clone for Channel
Source§fn clone(&self) -> Self
fn clone(&self) -> Self
Returns a clone of the Channel instance that shares the internal unbounded queue with the original channel. Scheduling callbacks on the same queue is faster than using separate channels, but might lead to starvation if one of the threads posts significantly more callbacks on the channel than the other one.
Cloned and referenced Channel instances might trigger additional event-loop tick when dropped. Channel can be wrapped into an Arc and shared between different threads/callers to avoid this.
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl Freeze for Channel
impl RefUnwindSafe for Channel
impl Send for Channel
impl Sync for Channel
impl Unpin for Channel
impl UnwindSafe for Channel
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more