You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A thread pool for isolating blocking I/O in async programs.
Sometimes there's no way to avoid blocking I/O. Consider files or stdin, which have weak async
support on modern operating systems. While IOCP, AIO, and io_uring are possible
solutions, they're not always available or ideal.
Since blocking is not allowed inside futures, we must move blocking I/O onto a special thread
pool provided by this crate. The pool dynamically spawns and stops threads depending on the
current number of running I/O jobs.
Note that there is a limit on the number of active threads. Once that limit is hit, a running
job has to finish before others get a chance to run. When a thread is idle, it waits for the
next job or shuts down after a certain timeout.
The default number of threads (set to 500) can be altered by setting BLOCKING_MAX_THREADS environment variable with value between 1 and 10000.
Examples
Read the contents of a file:
use blocking::unblock;use std::fs;let contents = unblock(|| fs::read_to_string("file.txt")).await?;println!("{}", contents);
use blocking::Unblock;use futures_lite::prelude::*;use std::fs;letmut dir = Unblock::new(fs::read_dir(".")?);whileletSome(item) = dir.next().await{println!("{}", item?.file_name().to_string_lossy());}
Spawn a process:
use blocking::unblock;use std::process::Command;let out = unblock(|| Command::new("dir").output()).await?;
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
About
A thread pool for isolating blocking I/O in async programs