diff --git a/tokio/src/task/join_set.rs b/tokio/src/task/join_set.rs index c9251db86d7..267ceb55bcc 100644 --- a/tokio/src/task/join_set.rs +++ b/tokio/src/task/join_set.rs @@ -308,7 +308,7 @@ impl JoinSet { /// Tries to join one of the tasks in the set that has completed and return its output. /// - /// Returns `None` if the set is empty. + /// Returns `None` if the set is empty. pub fn try_join_next(&mut self) -> Option> { // Loop over all notified `JoinHandle`s to find one that's ready, or until none are left. loop { @@ -623,6 +623,51 @@ impl<'a, T: 'static> Builder<'a, T> { Ok(self.joinset.insert(self.builder.spawn_on(future, handle)?)) } + /// Spawn the blocking code on the blocking threadpool with this builder's + /// settings, and store it in the [`JoinSet`]. + /// + /// # Returns + /// + /// An [`AbortHandle`] that can be used to remotely cancel the task. + /// + /// # Panics + /// + /// This method panics if called outside of a Tokio runtime. + /// + /// [`JoinSet`]: crate::task::JoinSet + /// [`AbortHandle`]: crate::task::AbortHandle + #[track_caller] + pub fn spawn_blocking(self, f: F) -> std::io::Result + where + F: FnOnce() -> T, + F: Send + 'static, + T: Send, + { + Ok(self.joinset.insert(self.builder.spawn_blocking(f)?)) + } + + /// Spawn the blocking code on the blocking threadpool of the provided + /// runtime handle with this builder's settings, and store it in the + /// [`JoinSet`]. + /// + /// # Returns + /// + /// An [`AbortHandle`] that can be used to remotely cancel the task. + /// + /// [`JoinSet`]: crate::task::JoinSet + /// [`AbortHandle`]: crate::task::AbortHandle + #[track_caller] + pub fn spawn_blocking_on(self, f: F, handle: &Handle) -> std::io::Result + where + F: FnOnce() -> T, + F: Send + 'static, + T: Send, + { + Ok(self + .joinset + .insert(self.builder.spawn_blocking_on(f, handle)?)) + } + /// Spawn the provided task on the current [`LocalSet`] with this builder's /// settings, and store it in the [`JoinSet`]. ///