Files
phy/blocking/index.html
Orion Kindel 0ce894e6b0 doc
2025-03-18 10:30:23 -05:00

48 lines
7.8 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="A thread pool for isolating blocking I/O in async programs."><title>blocking - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2" crossorigin href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-42caa33d.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="blocking" data-themes="" data-resource-suffix="" data-rustdoc-version="1.84.0 (9fc6b4312 2025-01-07)" data-channel="1.84.0" data-search-js="search-92e6798f.js" data-settings-js="settings-0f613d39.js" ><script src="../static.files/storage-59e33391.js"></script><script defer src="../crates.js"></script><script defer src="../static.files/main-5f194d8c.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-893ab5e7.css"></noscript><link rel="icon" href="https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle" title="show sidebar"></button><a class="logo-container" href="../blocking/index.html"><img src="https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png" alt=""></a></nav><nav class="sidebar"><div class="sidebar-crate"><a class="logo-container" href="../blocking/index.html"><img src="https://raw.githubusercontent.com/smol-rs/smol/master/assets/images/logo_fullsize_transparent.png" alt="logo"></a><h2><a href="../blocking/index.html">blocking</a><span class="version">1.6.1</span></h2></div><div class="sidebar-elems"><ul class="block"><li><a id="all-types" href="all.html">All Items</a></li></ul><section id="rustdoc-toc"><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#examples" title="Examples">Examples</a></li></ul><h3><a href="#reexports">Crate Items</a></h3><ul class="block"><li><a href="#reexports" title="Re-exports">Re-exports</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#functions" title="Functions">Functions</a></li></ul></section><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer"></div><main><div class="width-limiter"><rustdoc-search></rustdoc-search><section id="main-content" class="content"><div class="main-heading"><h1>Crate <span>blocking</span><button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/blocking/lib.rs.html#1-1025">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>A thread pool for isolating blocking I/O in async programs.</p>
<p>Sometimes theres no way to avoid blocking I/O. Consider files or stdin, which have weak async
support on modern operating systems. While <a href="https://en.wikipedia.org/wiki/Input/output_completion_port">IOCP</a>, <a href="http://man7.org/linux/man-pages/man2/io_submit.2.html">AIO</a>, and <a href="https://lwn.net/Articles/776703">io_uring</a> are possible
solutions, theyre not always available or ideal.</p>
<p>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.</p>
<p>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.</p>
<p>The default number of threads (set to 500) can be altered by setting BLOCKING_MAX_THREADS environment
variable with value between 1 and 10000.</p>
<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2>
<p>Read the contents of a file:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>blocking::unblock;
<span class="kw">use </span>std::fs;
<span class="kw">let </span>contents = unblock(|| fs::read_to_string(<span class="string">"file.txt"</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
<span class="macro">println!</span>(<span class="string">"{}"</span>, contents);</code></pre></div>
<p>Read a file and pipe its contents to stdout:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>blocking::{unblock, Unblock};
<span class="kw">use </span>futures_lite::io;
<span class="kw">use </span>std::fs::File;
<span class="kw">let </span>input = unblock(|| File::open(<span class="string">"file.txt"</span>)).<span class="kw">await</span><span class="question-mark">?</span>;
<span class="kw">let </span>input = Unblock::new(input);
<span class="kw">let </span><span class="kw-2">mut </span>output = Unblock::new(std::io::stdout());
io::copy(input, <span class="kw-2">&amp;mut </span>output).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
<p>Iterate over the contents of a directory:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>blocking::Unblock;
<span class="kw">use </span>futures_lite::prelude::<span class="kw-2">*</span>;
<span class="kw">use </span>std::fs;
<span class="kw">let </span><span class="kw-2">mut </span>dir = Unblock::new(fs::read_dir(<span class="string">"."</span>)<span class="question-mark">?</span>);
<span class="kw">while let </span><span class="prelude-val">Some</span>(item) = dir.next().<span class="kw">await </span>{
<span class="macro">println!</span>(<span class="string">"{}"</span>, item<span class="question-mark">?</span>.file_name().to_string_lossy());
}</code></pre></div>
<p>Spawn a process:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>blocking::unblock;
<span class="kw">use </span>std::process::Command;
<span class="kw">let </span>out = unblock(|| Command::new(<span class="string">"dir"</span>).output()).<span class="kw">await</span><span class="question-mark">?</span>;</code></pre></div>
</div></details><h2 id="reexports" class="section-header">Re-exports<a href="#reexports" class="anchor">§</a></h2><ul class="item-table"><li><div class="item-name" id="reexport.Task"><code>pub use async_task::<a class="struct" href="../async_task/task/struct.Task.html" title="struct async_task::task::Task">Task</a>;</code></div></li></ul><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><ul class="item-table"><li><div class="item-name"><a class="struct" href="struct.Unblock.html" title="struct blocking::Unblock">Unblock</a></div><div class="desc docblock-short">Runs blocking I/O on a thread pool.</div></li></ul><h2 id="functions" class="section-header">Functions<a href="#functions" class="anchor">§</a></h2><ul class="item-table"><li><div class="item-name"><a class="fn" href="fn.unblock.html" title="fn blocking::unblock">unblock</a></div><div class="desc docblock-short">Runs blocking code on a thread pool.</div></li></ul></section></div></main></body></html>