Files
GopherGate/target/doc/tokio/task/coop/fn.cooperative.html
2026-02-26 12:00:21 -05:00

26 lines
6.9 KiB
HTML
Raw 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="Creates a wrapper future that makes the inner future cooperate with the Tokio scheduler."><title>cooperative in tokio::task::coop - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.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"href="../../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../../" data-static-root-path="../../../static.files/" data-current-crate="tokio" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../../static.files/favicon-044be391.svg"></head><body class="rustdoc fn"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">cooperative</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../../tokio/index.html">tokio</a><span class="version">1.49.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">cooperative</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#examples" title="Examples">Examples</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="index.html">In tokio::<wbr>task::<wbr>coop</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../../index.html">tokio</a>::<wbr><a href="../index.html">task</a>::<wbr><a href="index.html">coop</a></div><h1>Function <span class="fn">cooperative</span>&nbsp;<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/tokio/task/coop/mod.rs.html#490-492">Source</a> </span></div><pre class="rust item-decl"><code>pub fn cooperative&lt;F: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html" title="trait core::future::future::Future">Future</a>&gt;(fut: F) -&gt; <a class="struct" href="struct.Coop.html" title="struct tokio::task::coop::Coop">Coop</a>&lt;F&gt; <a href="#" class="tooltip" data-notable-ty="Coop&lt;F&gt;"></a></code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Creates a wrapper future that makes the inner future cooperate with the Tokio scheduler.</p>
<p>When polled, the wrapper will first call <a href="fn.poll_proceed.html" title="fn tokio::task::coop::poll_proceed"><code>poll_proceed</code></a> to consume task budget, and
immediately yield if the budget has been depleted. If budget was available, the inner future
is polled. The budget consumption will be made final using <a href="struct.RestoreOnPending.html#method.made_progress" title="method tokio::task::coop::RestoreOnPending::made_progress"><code>RestoreOnPending::made_progress</code></a>
if the inner future resolves to its final value.</p>
<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2>
<p>When you call <code>recv</code> on the <code>Receiver</code> of a <a href="../../sync/mpsc/index.html" title="mod tokio::sync::mpsc"><code>tokio::sync::mpsc</code></a>
channel, task budget will automatically be consumed when the next value is returned.
This makes tasks that use Tokio mpsc channels automatically cooperative.</p>
<p>If youre using <a href="https://docs.rs/futures/latest/futures/channel/mpsc/index.html"><code>futures::channel::mpsc</code></a>
instead, automatic task budget consumption will not happen. This example shows how can use
<code>cooperative</code> to make <code>futures::channel::mpsc</code> channels cooperate with the scheduler in the
same way Tokio channels do.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::task::coop::cooperative;
<span class="kw">use </span>futures::channel::mpsc::Receiver;
<span class="kw">use </span>futures::stream::StreamExt;
<span class="kw">async fn </span>receive_next&lt;T&gt;(receiver: <span class="kw-2">&amp;mut </span>Receiver&lt;T&gt;) -&gt; <span class="prelude-ty">Option</span>&lt;T&gt; {
<span class="comment">// Use `StreamExt::next` to obtain a `Future` that resolves to the next value
</span><span class="kw">let </span>recv_future = receiver.next();
<span class="comment">// Wrap it a cooperative wrapper
</span><span class="kw">let </span>coop_future = cooperative(recv_future);
<span class="comment">// And await
</span>coop_future.<span class="kw">await
</span>}</code></pre></div></div></details><script type="text/json" id="notable-traits-data">{"Coop<F>":"<h3>Notable traits for <code><a class=\"struct\" href=\"struct.Coop.html\" title=\"struct tokio::task::coop::Coop\">Coop</a>&lt;F&gt;</code></h3><pre><code><div class=\"where\">impl&lt;F: <a class=\"trait\" href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html\" title=\"trait core::future::future::Future\">Future</a>&gt; <a class=\"trait\" href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html\" title=\"trait core::future::future::Future\">Future</a> for <a class=\"struct\" href=\"struct.Coop.html\" title=\"struct tokio::task::coop::Coop\">Coop</a>&lt;F&gt;</div><div class=\"where\"> type <a href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html#associatedtype.Output\" class=\"associatedtype\">Output</a> = F::<a class=\"associatedtype\" href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html#associatedtype.Output\" title=\"type core::future::future::Future::Output\">Output</a>;</div>"}</script></section></div></main></body></html>