{"id":436734,"date":"2024-10-29T03:04:39","date_gmt":"2024-10-29T03:04:39","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=436734"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=436734","title":{"rendered":"<span>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 Rust \u0432 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u044f\u0445. \u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0430\u044f: Futures<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 Rust \u0432 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u044f\u0445<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/853358\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/853540\/\">\u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0430\u044f: Futures<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/854104\/\">\u0427\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f: Tasks<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u044f: IO<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u00a0\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e Rust<\/a> \u0431\u0435\u0437\u00a0\u043a\u0430\u043a\u043e\u0433\u043e\u2011\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043a\u0430\u043a\u00a0\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u043d\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f: \u0427\u0442\u043e\u00a0\u0442\u0430\u043a\u043e\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u00abfuture\u00bb? \u0427\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/future\/fn.join_all.html\">join_all<\/a>? \u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/fn.sleep.html\">tokio::time::sleep<\/a> \u043e\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/thread\/fn.sleep.html\">std::thread::sleep<\/a>?<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u0447\u0430\u0441\u0442\u0435\u0439 \u0432\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 Rust. \u0412\u0441\u043a\u043e\u0440\u0435 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c, \u0447\u0442\u043e\u00a0\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 <code>foo<\/code> \u0438 <code>join_all<\/code> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0430\u00a0\u0432\u043e\u0442 \u0441\u043e <code>sleep<\/code> \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. <a href=\"https:\/\/youtu.be\/QYSYAHDKtvM?t=17\">\u041d\u0430\u0447\u043d\u0435\u043c\u00a0\u0436\u0435<\/a>.<\/p>\n<h2>Foo<\/h2>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>foo<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">async fn foo(n: u64) {     println!(\"start {n}\");     tokio::time::sleep(Duration::from_secs(1)).await;     println!(\"end {n}\"); }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #1<\/a><\/p>\n<p>\u0410\u00a0\u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <code>foo<\/code> \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439, \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0434 \u0432\u0441\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u0435\u0435 \u043d\u0430\u00a0\u0447\u0430\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u043d\u0438\u0445. \u042d\u0442\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code> \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u0432\u00a0Playground.<\/p>\n<pre><code class=\"rust\">fn foo(n: u64) -&gt; Foo {     let started = false;     let duration = Duration::from_secs(1);     let sleep = Box::pin(tokio::time::sleep(duration));     Foo { n, started, sleep } }  struct Foo {     n: u64,     started: bool,     sleep: Pin&lt;Box&lt;tokio::time::Sleep&gt;&gt;, }  impl Future for Foo {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if !self.started {             println!(\"start {}\", self.n);             self.started = true;         }         if self.sleep.as_mut().poll(context).is_pending() {             return Poll::Pending;         }         println!(\"end {}\", self.n);         Poll::Ready(())     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++if+self.sleep.as_mut%28%29.poll%28context%29.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #2<\/a><\/p>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>foo<\/code>\u00a0\u2014 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>Foo<\/code>. \u041e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/fn.sleep.html\">tokio::time::sleep<\/a>, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 <code>.await<\/code> \u043a\u00a0future <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/struct.Sleep.html\">Sleep<\/a>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c\u0443 <code>sleep<\/code>. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e future \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>Foo<\/code>. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/boxed\/struct.Box.html#method.pin\">Box::pin<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\/struct.Pin.html\">Pin&lt;Box&lt;_&gt;&gt;<\/a> \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p><code>Foo<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f future \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\">Future<\/a>. \u041d\u0438\u0436\u0435 \u043a\u043e\u0434 \u0442\u0440\u0435\u0439\u0442\u0430 \u0438\u0437\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"rust\">pub trait Future {     type Output;      fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context) -&gt; Poll&lt;Self::Output&gt;; }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0442\u0440\u0435\u0439\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u043d\u043e\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 3\u00a0\u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445: <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\/struct.Pin.html\">Pin<\/a>, <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html\">Context<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/enum.Poll.html\">Poll<\/a>. \u041c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>Poll<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e <code>Context<\/code> \u0438 <code>Pin<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u043d\u0430\u00a0\u043f\u043e\u0442\u043e\u043c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Future::poll<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <code>Context<\/code> \u0438\u0437\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0433\u0434\u0430 <code>Foo::poll<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>Sleep::poll<\/code>, \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u0439 <code>Context<\/code>. \u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435\u00a0\u0434\u043e\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0434\u043e\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0430 Wake \u043d\u0438\u0436\u0435.<\/p>\n<p><code>Pin<\/code> \u044d\u0442\u043e \u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f\u00a0\u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u0438\u0434 \u0447\u0442\u043e <code>Pin<\/code> <em>\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442<\/em>. \u042f \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u0438\u0434, \u0447\u0442\u043e <code>Box::pin<\/code> \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>Box::new<\/code>, <code>Pin&lt;Box&lt;T&gt;&gt;<\/code> \u044d\u0442\u043e <code>Box&lt;T&gt;<\/code>, <code>Pin&lt;&amp;mut T&gt;<\/code> \u044d\u0442\u043e <code>&amp;mut T<\/code>, \u0430 <code>Pin&lt;Box&lt;T&gt;&gt;::as_mut<\/code> \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/boxed\/struct.Box.html#method.as_mut\">Box::as_mut<\/a>. <code>Pin<\/code> \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c Rust, \u043d\u043e\u00a0\u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u0435\u043c\u0441\u044f \u0432\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 future. \u041c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0435 Pin.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>Poll<\/code>. \u042d\u0442\u043e <code>enum<\/code> \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">pub enum Poll&lt;T&gt; {     Ready(T),     Pending, }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code> &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u0438\u0431\u043e <code>Poll::Ready<\/code>, \u043b\u0438\u0431\u043e <code>Poll::Pending<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Ready<\/code> \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e future \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Output<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0435\u0441\u0442\u044c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>poll<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Pending<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e future \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 <code>poll<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.<\/p>\n<p>\u0423 \u0432\u0430\u0441 \u043c\u043e\u0433 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: <em>\u0430 \u043a\u043e\u0433\u0434\u0430<\/em> \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e? \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e &#8212; \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f poll \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437 \u0437\u0430 \u0440\u0430\u0437\u043e\u043c \u0432 \u201c\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435\u201d \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Wake.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0440\u0435\u0439\u0442\u0430 <code>Future<\/code> \u0443 <code>Foo<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>poll<\/code>. \u041a\u043e\u0434:<\/p>\n<pre><code class=\"rust\">impl Future for Foo {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if !self.started {             println!(\"start {}\", self.n);             self.started = true;         }         if self.sleep.as_mut().poll(context).is_pending() {             return Poll::Pending;         }         println!(\"end {}\", self.n);         Poll::Ready(())     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++if+self.sleep.as_mut%28%29.poll%28context%29.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #2<\/a><\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 <code>poll<\/code>\u00a0\u0431\u044b\u043b\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Ready<\/code> \u0438\u043b\u0438 <code>Pending<\/code> \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0443 <code>poll<\/code> \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 future. \u0417\u0430\u0434\u0430\u0447\u0430 <code>Foo<\/code>\u00a0\u2014 \u0432\u044b\u0432\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d \u0438 \u0443\u0445\u043e\u0434 \u0432\u00a0\u0441\u043e\u043d, \u0447\u0442\u043e\u00a0\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code>.<\/p>\n<p>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441: <code>poll<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430. \u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u00a0\u043b\u0438\u0431\u043e <code>Ready<\/code>,\u00a0\u043b\u0438\u0431\u043e <code>Pending<\/code>. \u042d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e future \u0437\u0430\u00a0\u0440\u0430\u0437. \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443, <code>Foo::poll<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e <code>Sleep::poll<\/code>\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c <a href=\"https:\/\/play.rust-lang.org\/?mode=release&amp;edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++let+before+%3D+Instant%3A%3Anow%28%29%3B%0A++++++++let+poll_result+%3D+self.sleep.as_mut%28%29.poll%28context%29%3B%0A++++++++let+duration+%3D+Instant%3A%3Anow%28%29+-+before%3B%0A++++++++println%21%28%22Sleep%3A%3Apoll+returned+%7Bpoll_result%3A%3F%7D+in+%7Bduration%3A%3F%7D.%22%29%3B%0A++++++++if+poll_result.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/a> \u0438 \u0432\u044b\u0432\u043e\u0434, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435. \u0412 \u00ab<a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++thread%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29%3B+%2F%2F+Oops%21%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+don%27t+run+at+the+same+time...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435<\/a>\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0432\u043e\u00a0\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438, <code>thread::sleep<\/code> \u043d\u0430\u0440\u0443\u0448\u0438\u043b\u0430 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043d\u0430\u0448\u0438\u0445 future. \u0415\u0441\u043b\u0438 \u043c\u044b <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++Foo+%7B+n+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++%2F%2F+This+version+never+returns+Pending%2C+so+self.started+isn%27t+necessary.%0A++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++thread%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29%3B+%2F%2F+Oops%21%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+don%27t+run+at+the+same+time...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u00a0Foo::poll<\/a>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u043e\u0442\u00a0\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043d\u0430 \u0432 <code>poll<\/code> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 future.<\/p>\n<p><code>Foo<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u043b\u0430\u0433 <code>started<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u0435\u00a0\u043b\u0438\u0448\u044c \u0440\u0430\u0437 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code>. \u0424\u043b\u0430\u0433 <code>ended<\/code> \u0432\u00a0\u0442\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>poll<\/code> \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f <code>Ready<\/code>. \u0424\u043b\u0430\u0433 <code>started<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Foo<\/code> \u0432\u00a0\u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438. \u0412\u00a0\u0446\u0435\u043b\u043e\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0433\u043e\u2011\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0435\u0449\u0435 \u043f\u043e\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u0442\u043e\u0447\u0435\u043a <code>.await<\/code>, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code> \u043c\u043e\u0433\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0441\u00a0\u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00bb. \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u0443\u00a0\u043d\u0430\u0441\u00a0\u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>enum<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>bool<\/code>. \u041f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 <code>async fn<\/code> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0437\u0430\u00a0\u043d\u0430\u0441 \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f <code>async\/await<\/code> \u043a\u0430\u043a\u00a0\u0444\u0438\u0447\u0438 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<h2>Join<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u0442\u0435\u043c, \u043a\u0430\u043a\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 future, \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/future\/fn.join_all.html\">join_all<\/a>. \u041c\u043e\u0436\u0435\u0442 \u0441\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e <code>join_all<\/code> \u0437\u0430\u00a0\u043a\u0443\u043b\u0438\u0441\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043a\u0443\u044e\u2011\u0442\u043e \u043c\u0430\u0433\u0438\u044e \u043f\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>foo<\/code>, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u0434\u043b\u044f\u00a0\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 <code>join_all<\/code> \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <\/p>\n<pre><code class=\"rust\">fn join_all&lt;F: Future&gt;(futures: Vec&lt;F&gt;) -&gt; JoinAll&lt;F&gt; {     JoinAll {         futures: futures.into_iter().map(Box::pin).collect(),     } }  struct JoinAll&lt;F&gt; {     futures: Vec&lt;Pin&lt;Box&lt;F&gt;&gt;&gt;, }  impl&lt;F: Future&gt; Future for JoinAll&lt;F&gt; {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         let is_pending = |future: &amp;mut Pin&lt;Box&lt;F&gt;&gt;| {             future.as_mut().poll(context).is_pending()         };         self.futures.retain_mut(is_pending);         if self.futures.is_empty() {             Poll::Ready(())         } else {             Poll::Pending         }     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+join_all%3CF%3A+Future%3E%28futures%3A+Vec%3CF%3E%29+-%3E+JoinAll%3CF%3E+%7B%0A++++JoinAll+%7B%0A++++++++futures%3A+futures.into_iter%28%29.map%28Box%3A%3Apin%29.collect%28%29%2C%0A++++%7D%0A%7D%0A%0Astruct+JoinAll%3CF%3E+%7B%0A++++futures%3A+Vec%3CPin%3CBox%3CF%3E%3E%3E%2C%0A%7D%0A%0Aimpl%3CF%3A+Future%3E+Future+for+JoinAll%3CF%3E+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++let+is_pending+%3D+%7Cfuture%3A+%26mut+Pin%3CBox%3CF%3E%3E%7C+%7B%0A++++++++++++future.as_mut%28%29.poll%28context%29.is_pending%28%29%0A++++++++%7D%3B%0A++++++++self.futures.retain_mut%28is_pending%29%3B%0A++++++++if+self.futures.is_empty%28%29+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+join_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #3<\/a><\/p>\n<p>\u041e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435, \u043d\u0430\u0448\u0430 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f <code>join_all<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0443\u044e \u0442\u0440\u0435\u0439\u0442 <code>Future<\/code>, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <code>Future::poll<\/code>. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u044f\u0442\u044c \u0435\u0441\u0442\u044c <code>Box::pin<\/code>, \u043d\u043e\u00a0\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0435\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 <code>poll<\/code> \u0432\u0441\u044e \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html#method.retain_mut\">Vec::retain_mut<\/a>. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>Vec<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 <code>false<\/code>. \u042d\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 future, \u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0438\u0435 <code>Ready<\/code>, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u00ab\u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u00bb.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 future \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a\u00a0\u043c\u0430\u0433\u0438\u044f, \u043d\u043e\u00a0\u043f\u043e\u00a0\u0441\u0443\u0442\u0438, \u0432\u0441\u0435 \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>poll<\/code> \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>Vec<\/code>. \u042d\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u0430, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 poll\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e future \u043e\u0434\u043d\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0448\u043e\u0440\u0442\u043a\u0430\u0442\u00a0\u2014 \u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 future. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>join_all<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>foo<\/code>, \u043d\u0435\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u0447\u0435\u0433\u043e\u2011\u043b\u0438\u0431\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f <code>join_all<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Vec&lt;F::Output&gt;<\/code>, \u0447\u0442\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f\u00a0\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u043a\u0430\u043a\u00a0\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f<\/p>\n<h2>Sleep<\/h2>\n<p>\u041c\u044b \u043d\u0430\u00a0\u0432\u0435\u0440\u043d\u043e\u043c \u043f\u0443\u0442\u0438! \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0443\u00a0\u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>sleep<\/code>:<\/p>\n<pre><code class=\"rust\">fn sleep(duration: Duration) -&gt; Sleep {     let wake_time = Instant::now() + duration;     Sleep { wake_time } }  struct Sleep {     wake_time: Instant, }  impl Future for Sleep {     type Output = ();      fn poll(self: Pin&lt;&amp;mut Self&gt;, _: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if Instant::now() &gt;= self.wake_time {             Poll::Ready(())         } else {             Poll::Pending         }     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+never+finish...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #4<\/a><\/p>\n<p>\u0425\u043c. \u041a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u0435\u0440\u043d\u043e, \u043d\u043e\u00a0\u043f\u0440\u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00abstart\u00bb \u0438 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++println%21%28%22Sleep+ready%22%29%3B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++println%21%28%22Sleep+pending%22%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+never+finish...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0432\u043e\u0434\u0430<\/a>, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 <code>Sleep<\/code> \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u00a0\u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u0427\u0442\u043e\u00a0\u043c\u044b \u0443\u043f\u0443\u0441\u043a\u0430\u0435\u043c?<\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0443 <code>poll<\/code> <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html#tymethod.poll\">\u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438<\/a>, \u0438 \u043f\u043e\u043a\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u0434\u0432\u0443\u043c\u044f. \u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, <code>poll<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f\u0441\u044c. \u0417\u0430\u0442\u0435\u043c, <code>poll<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Ready<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d, \u0438\u043b\u0438 <code>Pending<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442. \u041d\u043e, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 <code>poll<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>Pending<\/code>, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u00ab\u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435\u00bb. \u0410\u0445, \u0432\u043e\u0442 \u0447\u0442\u043e\u00a0\u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435\u00a0\u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u044d\u0442\u0438\u043c, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e <code>Foo<\/code> \u0438 <code>JoinAll<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 <code>Pending<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u00abfuture\u00bb \u0443\u0436\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u0438\u043c <code>Pending<\/code>, \u0447\u0442\u043e\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u041d\u043e <code>Sleep<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u00ableaf future\u00bb. \u0423\u00a0\u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 future \u043d\u0438\u0436\u0435 \u043f\u043e\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438, \u0438 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0443\u0434\u0438\u0442\u044c \u0441\u0435\u0431\u044f.<\/p>\n<h2>Wake<\/h2>\n<p>\u041f\u043e\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html\">Context<\/a>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u043c <code>context.waker()<\/code>, \u043e\u043d \u0432\u0435\u0440\u043d\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html\">Waker<\/a>. \u0412\u044b\u0437\u044b\u0432\u0430\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u0437\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake\">waker.wake()<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake_by_ref\">waker.wake_by_ref()<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u042d\u0442\u0438 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435, \u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u0447\u0442\u043e\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 <code>Pending<\/code> \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <code>Pending<\/code>:<\/p>\n<pre><code class=\"rust\">fn poll(self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {     if Instant::now() &gt;= self.wake_time {         Poll::Ready(())     } else {         context.waker().wake_by_ref();         Poll::Pending     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++context.waker%28%29.wake_by_ref%28%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #5<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u00ab\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0441\u043d\u043e\u043c\u00bb \u0440\u0435\u0448\u0435\u043d\u0430, \u043d\u043e\u00a0\u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0435 \u043d\u0430\u00a0\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00bb. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>poll<\/code> \u0441\u043d\u043e\u0432\u0430 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0442\u0430\u043a\u00a0\u0431\u044b\u0441\u0442\u0440\u043e, \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u0435\u0442, \u043f\u0440\u043e\u0436\u0438\u0433\u0430\u044f \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c 100% CPU \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e, <a href=\"https:\/\/play.rust-lang.org\/?mode=release&amp;edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++Sleep+%7B%0A++++++++wake_time%3A+Instant%3A%3Anow%28%29+%2B+duration%2C%0A++++++++poll_count%3A+0%2C%0A++++%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A++++poll_count%3A+u64%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++self.poll_count+%2B%3D+1%3B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++println%21%28%22polled+%7B%7D+times%22%2C+self.poll_count%29%3B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++context.waker%28%29.wake_by_ref%28%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\"><u>\u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 poll<\/u><\/a> \u0438\u043b\u0438\u00a0\u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, <a href=\"https:\/\/github.com\/oconnor663\/jacko.io\/blob\/master\/posts\/async_playground\/perf_stat.sh\"><u>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 perf \u0432\u00a0Linux<\/u><\/a>.<\/p>\n<p>\u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>Waker<\/code> \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f, \u043d\u043e\u00a0\u043c\u044b \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>thread::sleep<\/code> \u0432 <code>poll<\/code>. \u041e\u0434\u043d\u043e \u0438\u0437\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439\u00a0\u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c <code>thread::sleep<\/code> \u0437\u0430\u00a0\u043d\u0430\u0441 \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>wake<\/code>. \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u043c\u044b <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++let+wake_time+%3D+self.wake_time%3B%0A++++++++++++let+waker+%3D+context.waker%28%29.clone%28%29%3B%0A++++++++++++thread%3A%3Aspawn%28move+%7C%7C+%7B%0A++++++++++++++++thread%3A%3Asleep%28%0A++++++++++++++++++++wake_time.saturating_duration_since%28Instant%3A%3Anow%28%29%29%2C%0A++++++++++++++++%29%3B%0A++++++++++++++++waker.wake%28%29%3B%0A++++++++++++%7D%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D1_000+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\"><u>\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0432\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 pol<\/u><\/a>l, \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c\u00a0\u0431\u044b \u0441\u00a0\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/853358\/\">\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438<\/a>. \u041d\u043e\u00a0\u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u043e, <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Acollections%3A%3ABTreeMap%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Async%3A%3Ampsc%3A%3A%7Bchannel%2C+RecvTimeoutError%2C+Sender%7D%3B%0Ause+std%3A%3Async%3A%3ALazyLock%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%2C+Waker%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Astatic+WAKER_SENDER%3A+LazyLock%3CSender%3C%28Instant%2C+Waker%29%3E%3E+%3D%0A++++LazyLock%3A%3Anew%28%7C%7C+%7B%0A++++++++let+%28sender%2C+receiver%29+%3D+channel%3A%3A%3C%28Instant%2C+Waker%29%3E%28%29%3B%0A++++++++%2F%2F+Kick+off+the+waker+thread+the+first+time+this+sender+is+used.%0A++++++++thread%3A%3Aspawn%28move+%7C%7C+%7B%0A++++++++++++%2F%2F+A+sorted+multimap+of+wake+times+and+wakers.+The+soonest+wake+time+will+be+first.%0A++++++++++++let+mut+wake_times+%3D+BTreeMap%3A%3A%3CInstant%2C+Vec%3CWaker%3E%3E%3A%3Anew%28%29%3B%0A++++++++++++loop+%7B%0A++++++++++++++++%2F%2F+Wait+to+receive+a+new+%28wake_time%2C+waker%29+pair.+If+we+already+have+one+or+more%0A++++++++++++++++%2F%2F+wakers%2C+wait+with+a+timeout%2C+waking+up+at+the+earliest+known+wake+time.+Otherwise%2C%0A++++++++++++++++%2F%2F+wait+with+no+timeout.%0A++++++++++++++++let+new_pair+%3D+if+let+Some%28%28first_wake_time%2C+_%29%29+%3D%0A++++++++++++++++++++wake_times.first_key_value%28%29%0A++++++++++++++++%7B%0A++++++++++++++++++++let+timeout+%3D+first_wake_time%0A++++++++++++++++++++++++.saturating_duration_since%28Instant%3A%3Anow%28%29%29%3B%0A++++++++++++++++++++match+receiver.recv_timeout%28timeout%29+%7B%0A++++++++++++++++++++++++Ok%28%28wake_time%2C+waker%29%29+%3D%3E+Some%28%28wake_time%2C+waker%29%29%2C%0A++++++++++++++++++++++++Err%28RecvTimeoutError%3A%3ATimeout%29+%3D%3E+None%2C%0A++++++++++++++++++++++++Err%28RecvTimeoutError%3A%3ADisconnected%29+%3D%3E+%7B%0A++++++++++++++++++++++++++++unreachable%21%28%29%0A++++++++++++++++++++++++%7D%0A++++++++++++++++++++%7D%0A++++++++++++++++%7D+else+%7B%0A++++++++++++++++++++match+receiver.recv%28%29+%7B%0A++++++++++++++++++++++++Ok%28%28wake_time%2C+waker%29%29+%3D%3E+Some%28%28wake_time%2C+waker%29%29%2C%0A++++++++++++++++++++++++Err%28_%29+%3D%3E+unreachable%21%28%29%2C%0A++++++++++++++++++++%7D%0A++++++++++++++++%7D%3B%0A++++++++++++++++%2F%2F+If+we+got+a+waker+pair+above+%28i.e.+we+didn%27t+time+out%29%2C+add+it+to+the+map.%0A++++++++++++++++if+let+Some%28%28wake_time%2C+waker%29%29+%3D+new_pair+%7B%0A++++++++++++++++++++let+wakers_vec+%3D%0A++++++++++++++++++++++++wake_times.entry%28wake_time%29.or_default%28%29%3B%0A++++++++++++++++++++wakers_vec.push%28waker.clone%28%29%29%3B%0A++++++++++++++++%7D%0A++++++++++++++++%2F%2F+Loop+over+all+the+wakers+whose+wake+time+has+passed%2C+removing+them+from+the+map+and%0A++++++++++++++++%2F%2F+invoking+them.%0A++++++++++++++++while+let+Some%28entry%29+%3D+wake_times.first_entry%28%29+%7B%0A++++++++++++++++++++if+*entry.key%28%29+%3C%3D+Instant%3A%3Anow%28%29+%7B%0A++++++++++++++++++++++++entry.remove%28%29.into_iter%28%29.for_each%28Waker%3A%3Awake%29%3B%0A++++++++++++++++++++%7D+else+%7B%0A++++++++++++++++++++++++break%3B%0A++++++++++++++++++++%7D%0A++++++++++++++++%7D%0A++++++++++++%7D%0A++++++++%7D%29%3B%0A++++++++sender%0A++++%7D%29%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++let+waker_pair+%3D+%28self.wake_time%2C+context.waker%28%29.clone%28%29%29%3B%0A++++++++++++WAKER_SENDER.send%28waker_pair%29.unwrap%28%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D1_000+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\"><u>\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u043e\u0431\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 Wakers \u0432\u00a0\u043d\u0435\u0433\u043e<\/u><\/a>. \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e\u00a0\u0432\u00a0\u043d\u0435\u0439 \u043a\u043e\u0435\u2011\u0447\u0442\u043e \u043d\u0435\u00a0\u0442\u0430\u043a. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0441\u043d\u0430. \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u0430 \u0441\u043f\u044f\u0449\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u0440\u043e\u0431\u0443\u0434\u0438\u0442\u044c \u043d\u0430\u0448 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f?<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0436, \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u0438 \u0440\u0430\u0434\u0438, \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0435\u0441\u0442\u044c\u00a0\u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <code>tokio::time::sleep<\/code>. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u043c\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>sleep<\/code> \u0438 \u043d\u0435\u00a0\u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0434\u043b\u044f\u00a0\u0435\u0433\u043e \u043d\u0435\u0433\u043e, \u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>main<\/code>.<\/p>\n<h2>Main<\/h2>\n<p>\u0414\u043b\u044f\u00a0\u0432\u044b\u0437\u043e\u0432\u0430 <code>poll<\/code> \u0438\u0437 <code>main<\/code> \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <code>Context<\/code> \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u00a0\u043d\u0435\u0433\u043e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html#method.from_waker\">Context::from_waker<\/a>, \u043d\u043e\u00a0\u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <code>Waker<\/code>. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e, \u043d\u043e\u00a0\u043f\u043e\u043a\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430\u00a0\u043b\u0438\u0448\u044c \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0434\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/task\/fn.noop_waker.html\">noop_waker<\/a> (\u00abNoop\u00bb, \u00abno\u2011op\u00bb \u0438 \u00abnop\u00bb\u00a0\u2014 \u044d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u00abno operation\u00bb). \u041a\u0430\u043a\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>Context<\/code>, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>poll<\/code> \u0432\u00a0\u0446\u0438\u043a\u043b\u0435:<\/p>\n<pre><code class=\"rust\">fn main() {     let mut futures = Vec::new();     for n in 1..=10 {         futures.push(foo(n));     }     let mut joined_future = Box::pin(future::join_all(futures));     let waker = futures::task::noop_waker();     let mut context = Context::from_waker(&amp;waker);     while joined_future.as_mut().poll(&amp;mut context).is_pending() {         \/\/ Busy loop!     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++context.waker%28%29.wake_by_ref%28%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+Busy+loop%21%0A++++%7D%0A%7D\">Playground #6<\/a><\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u0425\u043e\u0442\u044f \u0443\u00a0\u043d\u0430\u0441 \u0432\u0441\u0435 \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00bb, \u043a\u0430\u043a\u00a0\u0438 \u0432\u044b\u0448\u0435. \u041d\u043e\u00a0\u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0435\u0448\u0430\u0442\u044c \u0435\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u043f\u0440\u043e\u0441, \u0438 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u0448 <code>Waker<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: \u043d\u0443\u0436\u043d\u043e\u00a0\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>Waker<\/code> \u0432 <code>Sleep::poll<\/code>? \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e\u00a0\u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e. \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443, <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+Busy+loop%21%0A++++%7D%0A%7D\">\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e<\/a>. \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u00a0\u0434\u0435\u0441\u044f\u0442\u0438 \u0434\u043e\u00a0\u0441\u0442\u0430, <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++println%21%28%22These+jobs+never+finish...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D100+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+Busy+loop%21%0A++++%7D%0A%7D\">\u043d\u0430\u0448\u0438 \u00abfuture\u00bb \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u00ab\u043f\u0440\u043e\u0441\u043d\u0443\u0442\u0441\u044f\u00bb<\/a>. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e, \u0445\u043e\u0442\u044f \u043d\u0430\u0448 <code>Waker<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442, \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 <code>Waker<\/code>. \u041a\u043e\u0433\u0434\u0430 <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/future\/struct.JoinAll.html\">futures::future::JoinAll<\/a> \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u00abfuture\u00bb (\u0432 \u0432\u0435\u0440\u0441\u0438\u0438 futures v0.3.30\u00a0\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 \u0440\u0430\u0432\u0435\u043d 31), \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 <code>Waker<\/code> \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u00a0\u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u00ab\u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u00bb. \u042d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u0447\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435, \u043d\u043e\u00a0\u0442\u0430\u043a\u0436\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>Waker<\/code>, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u00a0\u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u043e \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u00abfuture\u00bb, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>Pending<\/code>, \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0441\u0432\u043e\u0435\u0433\u043e <code>Waker<\/code>. <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a <code>main<\/code>. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00bb. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b <code>main<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <code>thread::sleep<\/code> \u0434\u043e\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u043e\u0441\u043e\u0431, \u0447\u0442\u043e\u0431\u044b <code>Sleep::poll<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b <code>Waker<\/code> \u0438 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0432 <code>main<\/code>. \u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043e\u0431\u0435\u0440\u043d\u0435\u043c \u0435\u0435 \u0432 <code>Mutex<\/code>, \u0447\u0442\u043e\u0431\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0433 \u0435\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<pre><code class=\"rust\">static WAKE_TIMES: Mutex&lt;BTreeMap&lt;Instant, Vec&lt;Waker&gt;&gt;&gt; =     Mutex::new(BTreeMap::new());<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Acollections%3A%3ABTreeMap%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Async%3A%3AMutex%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%2C+Waker%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astatic+WAKE_TIMES%3A+Mutex%3CBTreeMap%3CInstant%2C+Vec%3CWaker%3E%3E%3E+%3D%0A++++Mutex%3A%3Anew%28BTreeMap%3A%3Anew%28%29%29%3B%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++++++let+wakers_vec+%3D+wake_times.entry%28self.wake_time%29.or_default%28%29%3B%0A++++++++++++wakers_vec.push%28context.waker%28%29.clone%28%29%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+The+joined+future+is+Pending.+Sleep+until+the+next+wake+time.%0A++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++let+next_wake+%3D+wake_times.keys%28%29.next%28%29.expect%28%22sleep+forever%3F%22%29%3B%0A++++++++thread%3A%3Asleep%28next_wake.saturating_duration_since%28Instant%3A%3Anow%28%29%29%29%3B%0A++++++++%2F%2F+We+just+woke+up.+Invoke+all+the+Wakers+whose+time+has+come.%0A++++++++while+let+Some%28entry%29+%3D+wake_times.first_entry%28%29+%7B%0A++++++++++++if+*entry.key%28%29+%3C%3D+Instant%3A%3Anow%28%29+%7B%0A++++++++++++++++entry.remove%28%29.into_iter%28%29.for_each%28Waker%3A%3Awake%29%3B%0A++++++++++++%7D+else+%7B%0A++++++++++++++++break%3B%0A++++++++++++%7D%0A++++++++%7D%0A++++++++%2F%2F+Loop+and+poll+again.%0A++++%7D%0A%7D\">Playground #7<\/a><\/p>\n<p>\u042d\u0442\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <code>map<\/code> \u043e\u0442\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043e <code>Waker<\/code>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c\u00a0\u2014 <code>Vec&lt;Waker&gt;<\/code>, \u0430\u00a0\u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e <code>Waker<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <code>Instant<\/code> \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <code>Waker<\/code>. \u042d\u0442\u043e \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043d\u0430\u00a0Linux \u0438 macOS, \u0433\u0434\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 <code>Instant::now()<\/code> \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u043d\u043e\u00a0\u043d\u0430\u00a0Windows \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 15,6\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. <\/p>\n<p><code>Sleep::poll<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439 <code>Waker<\/code> \u0432\u00a0\u044d\u0442\u043e\u0442 <code>map<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/collections\/struct.BTreeMap.html#method.entry\">BTreeMap::entry<\/a>:<\/p>\n<pre><code class=\"rust\">fn poll(self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {     if Instant::now() &gt;= self.wake_time {         Poll::Ready(())     } else {         let mut wake_times = WAKE_TIMES.lock().unwrap();         let wakers_vec = wake_times.entry(self.wake_time).or_default();         wakers_vec.push(context.waker().clone());         Poll::Pending     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Acollections%3A%3ABTreeMap%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Async%3A%3AMutex%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%2C+Waker%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astatic+WAKE_TIMES%3A+Mutex%3CBTreeMap%3CInstant%2C+Vec%3CWaker%3E%3E%3E+%3D%0A++++Mutex%3A%3Anew%28BTreeMap%3A%3Anew%28%29%29%3B%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++++++let+wakers_vec+%3D+wake_times.entry%28self.wake_time%29.or_default%28%29%3B%0A++++++++++++wakers_vec.push%28context.waker%28%29.clone%28%29%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+The+joined+future+is+Pending.+Sleep+until+the+next+wake+time.%0A++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++let+next_wake+%3D+wake_times.keys%28%29.next%28%29.expect%28%22sleep+forever%3F%22%29%3B%0A++++++++thread%3A%3Asleep%28next_wake.saturating_duration_since%28Instant%3A%3Anow%28%29%29%29%3B%0A++++++++%2F%2F+We+just+woke+up.+Invoke+all+the+Wakers+whose+time+has+come.%0A++++++++while+let+Some%28entry%29+%3D+wake_times.first_entry%28%29+%7B%0A++++++++++++if+*entry.key%28%29+%3C%3D+Instant%3A%3Anow%28%29+%7B%0A++++++++++++++++entry.remove%28%29.into_iter%28%29.for_each%28Waker%3A%3Awake%29%3B%0A++++++++++++%7D+else+%7B%0A++++++++++++++++break%3B%0A++++++++++++%7D%0A++++++++%7D%0A++++++++%2F%2F+Loop+and+poll+again.%0A++++%7D%0A%7D\">Playground #7<\/a><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u043f\u0440\u043e\u0441\u0430 \u043d\u0430\u0448 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043c\u043e\u0436\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438\u0437 <code>map<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>thread::sleep<\/code> \u0434\u043e\u00a0\u044d\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00bb. \u0414\u0430\u043b\u0435\u0435 \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 <code>Waker<\/code>, \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u0438 \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043d\u043e\u0432\u0430:<\/p>\n<pre><code class=\"rust\">fn main() {     let mut futures = Vec::new();     for n in 1..=10 {         futures.push(foo(n));     }     let mut joined_future = Box::pin(future::join_all(futures));     let waker = futures::task::noop_waker();     let mut context = Context::from_waker(&amp;waker);     while joined_future.as_mut().poll(&amp;mut context).is_pending() {         \/\/ The joined future is Pending. Sleep until the next wake time.         let mut wake_times = WAKE_TIMES.lock().unwrap();         let next_wake = wake_times.keys().next().expect(\"sleep forever?\");         thread::sleep(next_wake.saturating_duration_since(Instant::now()));         \/\/ We just woke up. Invoke all the Wakers whose time has come.         while let Some(entry) = wake_times.first_entry() {             if *entry.key() &lt;= Instant::now() {                 entry.remove().into_iter().for_each(Waker::wake);             } else {                 break;             }         }         \/\/ Loop and poll again.     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Acollections%3A%3ABTreeMap%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Async%3A%3AMutex%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%2C+Waker%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astatic+WAKE_TIMES%3A+Mutex%3CBTreeMap%3CInstant%2C+Vec%3CWaker%3E%3E%3E+%3D%0A++++Mutex%3A%3Anew%28BTreeMap%3A%3Anew%28%29%29%3B%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++++++let+wakers_vec+%3D+wake_times.entry%28self.wake_time%29.or_default%28%29%3B%0A++++++++++++wakers_vec.push%28context.waker%28%29.clone%28%29%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+mut+joined_future+%3D+Box%3A%3Apin%28future%3A%3Ajoin_all%28futures%29%29%3B%0A++++let+waker+%3D+futures%3A%3Atask%3A%3Anoop_waker%28%29%3B%0A++++let+mut+context+%3D+Context%3A%3Afrom_waker%28%26waker%29%3B%0A++++while+joined_future.as_mut%28%29.poll%28%26mut+context%29.is_pending%28%29+%7B%0A++++++++%2F%2F+The+joined+future+is+Pending.+Sleep+until+the+next+wake+time.%0A++++++++let+mut+wake_times+%3D+WAKE_TIMES.lock%28%29.unwrap%28%29%3B%0A++++++++let+next_wake+%3D+wake_times.keys%28%29.next%28%29.expect%28%22sleep+forever%3F%22%29%3B%0A++++++++thread%3A%3Asleep%28next_wake.saturating_duration_since%28Instant%3A%3Anow%28%29%29%29%3B%0A++++++++%2F%2F+We+just+woke+up.+Invoke+all+the+Wakers+whose+time+has+come.%0A++++++++while+let+Some%28entry%29+%3D+wake_times.first_entry%28%29+%7B%0A++++++++++++if+*entry.key%28%29+%3C%3D+Instant%3A%3Anow%28%29+%7B%0A++++++++++++++++entry.remove%28%29.into_iter%28%29.for_each%28Waker%3A%3Awake%29%3B%0A++++++++++++%7D+else+%7B%0A++++++++++++++++break%3B%0A++++++++++++%7D%0A++++++++%7D%0A++++++++%2F%2F+Loop+and+poll+again.%0A++++%7D%0A%7D\">Playground #7<\/a><\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442! \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0437\u0430\u043d\u044f\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430\u00bb \u0438 \u043d\u0435\u00a0\u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438. \u042d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>sleep<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438. \u0412\u043e\u00a0\u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u043d\u0430\u0448 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0434\u043b\u044f\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u00ab\u0437\u0430\u0434\u0430\u0447\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c, \u043a\u0430\u043a\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u00abfuture\u00bb, \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439, \u0445\u043e\u0442\u044f \u043e\u043d\u0438 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u0438\u0445 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. <\/p>\n<h2>\u0411\u043e\u043d\u0443\u0441: Pin<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c <code>async fn<\/code> \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>Future<\/code>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e <code>Pin<\/code> \u0438 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d \u0440\u0435\u0448\u0430\u0435\u0442. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 <code>async fn foo<\/code> \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u043d\u0443\u0442\u0440\u0438:  <\/p>\n<pre><code class=\"rust\">async fn foo(n: u64) {     let n_ref = &amp;n;     println!(\"start {n_ref}\");     tokio::time::sleep(Duration::from_secs(1)).await;     println!(\"end {n_ref}\"); }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++let+n_ref+%3D+%26n%3B%0A++++println%21%28%22start+%7Bn_ref%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn_ref%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++foo%281%29.await%3B%0A++++foo%282%29.await%3B%0A++++foo%283%29.await%3B%0A%7D\">Playground #8<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0\u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u00a0Rust. \u041d\u043e\u00a0\u043a\u0430\u043a\u00a0\u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u00a0\u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 future <code>Foo<\/code>? <\/p>\n<pre><code class=\"rust\">struct Foo {     n: u64,     n_ref: &amp;u64,     started: bool,     sleep: Pin&lt;Box&lt;tokio::time::Sleep&gt;&gt;, }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=struct+Foo+%7B%0A++++n%3A+u64%2C%0A++++n_ref%3A+%26u64%2C%0A++++%2F%2F+other+fields...%0A%7D%0A%0Afn+main%28%29+%7B%7D\">Playground #9<\/a><\/p>\n<p>\u041a\u043e\u0434 \u043d\u0435\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f: <\/p>\n<pre><code class=\"rust\">error[E0106]: missing lifetime specifier  --&gt; src\/main.rs:3:12   | 3 |     n_ref: &amp;u64,   |            ^ expected named lifetime parameter<\/code><\/pre>\n<p>\u041a\u0430\u043a\u0438\u043c \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 <code>n_ref<\/code>? \u041a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043e\u0442\u0432\u0435\u0442: \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442. \u0421\u0430\u043c\u043e\u2011\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u00a0\u0446\u0435\u043b\u043e\u043c \u043d\u0435\u00a0\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0432\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 Rust, \u0438 \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>n_ref<\/code>, \u043d\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430. \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u043e\u043d\u00a0\u0431\u044b\u043b, \u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u00a0\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c <code>n<\/code> \u0438 \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c <code>Foo<\/code>.<\/p>\n<p>\u041d\u043e\u00a0\u0442\u043e\u0433\u0434\u0430, \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f <code>Future<\/code> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043b\u044f <code>async fn foo<\/code> \u0432\u044b\u0448\u0435? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, Rust \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <a href=\"https:\/\/tmandry.gitlab.io\/blog\/posts\/optimizing-await-1\/#generators-as-data-structures\"><u>\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0432\u0435\u0449\u0438<\/u><\/a> \u0432\u043d\u0443\u0442\u0440\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u0435 \u043b\u0430\u0439\u0444\u0442\u0430\u0439\u043c\u044b, \u043a\u0430\u043a\u00a0\u0432\u00a0\u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>n_ref<\/code>. \u0417\u0430\u0434\u0430\u0447\u0430 \u043e\u0431\u0435\u0440\u0442\u043a\u0438\u2011\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f <code>Pin<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 futures, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <code>JoinAll<\/code>, \u0432\u00a0\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>Pin<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u00a0\u0430\u0432\u0442\u043e\u2011\u0442\u0440\u0435\u0439\u0442\u043e\u043c <a href=\"https:\/\/doc.rust-lang.org\/std\/marker\/trait.Unpin.html\"><u>Unpin<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0434\u043b\u044f\u00a0\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c futures, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 <code>async<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b\u00a0\u043b\u0438\u0431\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b <code>Unpin<\/code> (\u043a\u0430\u043a <a href=\"https:\/\/doc.rust-lang.org\/core\/pin\/struct.Pin.html#impl-DerefMut-for-Pin%3CPtr%3E\"><u>DerefMut<\/u><\/a>),\u00a0\u043b\u0438\u0431\u043e \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a <code>unsafe<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/doc.rust-lang.org\/core\/pin\/struct.Pin.html#method.get_unchecked_mut\"><u>get_unchecked_mut<\/u><\/a>). \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u0448\u0435 \u0448\u0438\u0440\u043e\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>Box::pin<\/code> \u0432\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432\u044b\u0448\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u043d\u0430\u0448\u0438 futures \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u00a0\u0431\u044b\u043b\u0438 <code>Unpin<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e <code>DerefMut<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a <code>Pin&lt;&amp;mut Self&gt;<\/code>, \u0438 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <code>self.started<\/code> \u0438 <code>self.futures<\/code>, \u043d\u0435\u00a0\u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u044f\u0441\u044c \u043e\u0431\u00a0\u044d\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 Pin, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f\u00a0\u0437\u0430\u0434\u0430\u0447 (\u0432\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c) \u0438\u043b\u0438\u00a0\u0432\u0432\u043e\u0434\u0430\u2011\u0432\u044b\u0432\u043e\u0434\u0430 (\u0442\u0440\u0435\u0442\u044c\u044f \u0447\u0430\u0441\u0442\u044c). \u041d\u043e\u00a0\u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 <a href=\"https:\/\/without.boats\/blog\/pin\"><u>\u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043e\u0442\u00a0\u0430\u0432\u0442\u043e\u0440\u0430 Pin<\/u><\/a>, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0447\u0442\u0438\u0442\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\"><u>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e Pin<\/u><\/a>.<\/p>\n<h2>\u0411\u043e\u043d\u0443\u0441: \u041e\u0442\u043c\u0435\u043d\u0430<\/h2>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0438 \u043e\u0449\u0443\u0449\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e\u00a0\u0441\u00a0\u043e\u0441\u043e\u0431\u044b\u043c\u0438 \u0441\u0443\u043f\u0435\u0440\u0441\u0438\u043b\u0430\u043c\u0438. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u0441\u0443\u043f\u0435\u0440\u0441\u0438\u043b\u0430, \u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043d\u0435\u00a0\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b\u0438.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0443\u043f\u0435\u0440\u0441\u0438\u043b\u0430\u00a0\u2014 \u043e\u0442\u043c\u0435\u043d\u0430. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435, \u0443\u00a0\u043d\u0430\u0441 \u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0433\u043e\u2011\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041d\u043e\u00a0\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u043e\u0439 future \u043f\u0440\u043e\u0441\u0442\u043e\u2026\u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u0435\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0432 <code>tokio<\/code> \u0435\u0441\u0442\u044c <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/fn.timeout.html\">tokio::time::timeout<\/a>, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<pre><code class=\"rust\">struct Timeout&lt;F&gt; {     sleep: Pin&lt;Box&lt;tokio::time::Sleep&gt;&gt;,     inner: Pin&lt;Box&lt;F&gt;&gt;, }  impl&lt;F: Future&gt; Future for Timeout&lt;F&gt; {     type Output = Option&lt;F::Output&gt;;      fn poll(         mut self: Pin&lt;&amp;mut Self&gt;,         context: &amp;mut Context,     ) -&gt; Poll&lt;Self::Output&gt; {         \/\/ Check whether the inner future is finished.         if let Poll::Ready(output) = self.inner.as_mut().poll(context) {             return Poll::Ready(Some(output));         }         \/\/ Check whether time is up.         if self.sleep.as_mut().poll(context).is_ready() {             return Poll::Ready(None);         }         \/\/ Still waiting.         Poll::Pending     } }  fn timeout&lt;F: Future&gt;(duration: Duration, inner: F) -&gt; Timeout&lt;F&gt; {     Timeout {         sleep: Box::pin(tokio::time::sleep(duration)),         inner: Box::pin(inner),     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+rand%3A%3Aprelude%3A%3A*%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28_n%3A+u64%29+%7B%0A++++let+mut+rng+%3D+rand%3A%3Athread_rng%28%29%3B%0A++++let+sleep_seconds+%3D+rng.gen_range%280.0..100.0%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs_f32%28sleep_seconds%29%29.await%3B%0A++++println%21%28%22foo+finished+in+%7Bsleep_seconds%3A.3%7D+seconds%22%29%3B%0A%7D%0A%0Astruct+Timeout%3CF%3E+%7B%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A++++inner%3A+Pin%3CBox%3CF%3E%3E%2C%0A%7D%0A%0Aimpl%3CF%3A+Future%3E+Future+for+Timeout%3CF%3E+%7B%0A++++type+Output+%3D+Option%3CF%3A%3AOutput%3E%3B%0A%0A++++fn+poll%28%0A++++++++mut+self%3A+Pin%3C%26mut+Self%3E%2C%0A++++++++context%3A+%26mut+Context%2C%0A++++%29+-%3E+Poll%3CSelf%3A%3AOutput%3E+%7B%0A++++++++%2F%2F+Check+whether+the+inner+future+is+finished.%0A++++++++if+let+Poll%3A%3AReady%28output%29+%3D+self.inner.as_mut%28%29.poll%28context%29+%7B%0A++++++++++++return+Poll%3A%3AReady%28Some%28output%29%29%3B%0A++++++++%7D%0A++++++++%2F%2F+Check+whether+time+is+up.%0A++++++++if+self.sleep.as_mut%28%29.poll%28context%29.is_ready%28%29+%7B%0A++++++++++++return+Poll%3A%3AReady%28None%29%3B%0A++++++++%7D%0A++++++++%2F%2F+Still+waiting.%0A++++++++Poll%3A%3APending%0A++++%7D%0A%7D%0A%0Afn+timeout%3CF%3A+Future%3E%28duration%3A+Duration%2C+inner%3A+F%29+-%3E+Timeout%3CF%3E+%7B%0A++++Timeout+%7B%0A++++++++sleep%3A+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%2C%0A++++++++inner%3A+Box%3A%3Apin%28inner%29%2C%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22Start+with+a+thousand+jobs.+Each+one+does+a+random+sleep%2C%22%29%3B%0A++++println%21%28%22between+0+and+100+seconds.+Time+out+after+1+second%2C+so+on%22%29%3B%0A++++println%21%28%22average+only+10+jobs+will+finish.%5Cn%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D1_000+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+all+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++timeout%28Duration%3A%3Afrom_secs%281%29%2C+all%29.await%3B%0A%7D\">Playground #10<\/a><\/p>\n<p>\u042d\u0442\u0430 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <em>\u043b\u044e\u0431\u043e\u0439<\/em> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439. \u0423\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043d\u0435\u0442. <\/p>\n<h2>\u0411\u043e\u043d\u0443\u0441: \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044f<\/h2>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0441\u0443\u043f\u0435\u0440\u0441\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043d\u0435\u00a0\u0445\u0432\u0430\u0442\u0430\u0435\u0442\u00a0\u2014 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f. \u041f\u0440\u0438\u00a0\u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"rust\">async fn factorial(n: u64) -&gt; u64 {     if n == 0 {         1     } else {         n * factorial(n - 1).await     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=async+fn+factorial%28n%3A+u64%29+-%3E+u64+%7B%0A++++if+n+%3D%3D+0+%7B%0A++++++++1%0A++++%7D+else+%7B%0A++++++++n+*+factorial%28n+-+1%29.await%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22%7B%7D%22%2C+factorial%2810%29.await%29%3B%0A%7D\">Playground #11<\/a><\/p>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438: <\/p>\n<pre><code class=\"rust\">error[E0733]: recursion in an async fn requires boxing  --&gt; recursion.rs:1:1   | 1 | async fn factorial(n: u64) -&gt; u64 {   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ \u2026 5 |         n * factorial(n - 1).await   |             ---------------------- recursive call here   |   = note: a recursive `async fn` must introduce indirection such as `Box::pin` to avoid an infinitely sized future<\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043e\u043d\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 <code>.await<\/code> \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u043e\u043d\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b. \u0415\u0441\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f, \u0435\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u044b\u0439 future \u0432 <code>Box<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>.await<\/code>:  <\/p>\n<pre><code class=\"rust\">async fn factorial(n: u64) -&gt; u64 {     if n == 0 {         1     } else {         let recurse = Box::pin(factorial(n - 1));         n * recurse.await     } }<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u00a0\u043a\u0443\u0447\u0435.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c \u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/854104\/\">\u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u00ab\u0437\u0430\u0434\u0430\u0447\u0430\u043c\u00bb<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/853540\/\"> https:\/\/habr.com\/ru\/articles\/853540\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 Rust \u0432 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u044f\u0445<\/h2>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/853358\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/853540\/\">\u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0430\u044f: Futures<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/854104\/\">\u0427\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f: Tasks<\/a><\/p>\n<\/li>\n<li>\n<p>\u0427\u0430\u0441\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u044f: IO<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u00a0\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043d\u0430 <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e Rust<\/a> \u0431\u0435\u0437\u00a0\u043a\u0430\u043a\u043e\u0433\u043e\u2011\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f, \u043a\u0430\u043a\u00a0\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u043d\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f: \u0427\u0442\u043e\u00a0\u0442\u0430\u043a\u043e\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0438\u043c\u0438 \u00abfuture\u00bb? \u0427\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/future\/fn.join_all.html\">join_all<\/a>? \u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/fn.sleep.html\">tokio::time::sleep<\/a> \u043e\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/thread\/fn.sleep.html\">std::thread::sleep<\/a>?<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u0447\u0430\u0441\u0442\u0435\u0439 \u0432\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 Rust. \u0412\u0441\u043a\u043e\u0440\u0435 \u043c\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c, \u0447\u0442\u043e\u00a0\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 <code>foo<\/code> \u0438 <code>join_all<\/code> \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0430\u00a0\u0432\u043e\u0442 \u0441\u043e <code>sleep<\/code> \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. <a href=\"https:\/\/youtu.be\/QYSYAHDKtvM?t=17\">\u041d\u0430\u0447\u043d\u0435\u043c\u00a0\u0436\u0435<\/a>.<\/p>\n<h2>Foo<\/h2>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>foo<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">async fn foo(n: u64) {     println!(\"start {n}\");     tokio::time::sleep(Duration::from_secs(1)).await;     println!(\"end {n}\"); }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #1<\/a><\/p>\n<p>\u0410\u00a0\u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <code>foo<\/code> \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439, \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0434 \u0432\u0441\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u044c\u0435\u043c \u0435\u0435 \u043d\u0430\u00a0\u0447\u0430\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u043d\u0438\u0445. \u042d\u0442\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>main<\/code> \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u044f \u0432\u00a0Playground.<\/p>\n<pre><code class=\"rust\">fn foo(n: u64) -&gt; Foo {     let started = false;     let duration = Duration::from_secs(1);     let sleep = Box::pin(tokio::time::sleep(duration));     Foo { n, started, sleep } }  struct Foo {     n: u64,     started: bool,     sleep: Pin&lt;Box&lt;tokio::time::Sleep&gt;&gt;, }  impl Future for Foo {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if !self.started {             println!(\"start {}\", self.n);             self.started = true;         }         if self.sleep.as_mut().poll(context).is_pending() {             return Poll::Pending;         }         println!(\"end {}\", self.n);         Poll::Ready(())     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++if+self.sleep.as_mut%28%29.poll%28context%29.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #2<\/a><\/p>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>foo<\/code>\u00a0\u2014 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>Foo<\/code>. \u041e\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/fn.sleep.html\">tokio::time::sleep<\/a>, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 <code>.await<\/code> \u043a\u00a0future <a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/time\/struct.Sleep.html\">Sleep<\/a>, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c\u0443 <code>sleep<\/code>. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e future \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>Foo<\/code>. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/boxed\/struct.Box.html#method.pin\">Box::pin<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\/struct.Pin.html\">Pin&lt;Box&lt;_&gt;&gt;<\/a> \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p><code>Foo<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f future \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\">Future<\/a>. \u041d\u0438\u0436\u0435 \u043a\u043e\u0434 \u0442\u0440\u0435\u0439\u0442\u0430 \u0438\u0437\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"rust\">pub trait Future {     type Output;      fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context) -&gt; Poll&lt;Self::Output&gt;; }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0442\u0440\u0435\u0439\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430, \u043d\u043e\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 3\u00a0\u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445: <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\/struct.Pin.html\">Pin<\/a>, <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html\">Context<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/enum.Poll.html\">Poll<\/a>. \u041c\u044b \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>Poll<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e <code>Context<\/code> \u0438 <code>Pin<\/code>, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0445 \u043d\u0430\u00a0\u043f\u043e\u0442\u043e\u043c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Future::poll<\/code> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <code>Context<\/code> \u0438\u0437\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0433\u0434\u0430 <code>Foo::poll<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>Sleep::poll<\/code>, \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0435\u0439 <code>Context<\/code>. \u041d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0432\u0441\u0435, \u0447\u0442\u043e\u00a0\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435\u00a0\u0434\u043e\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0434\u043e\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0430 Wake \u043d\u0438\u0436\u0435.<\/p>\n<p><code>Pin<\/code> \u044d\u0442\u043e \u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f\u00a0\u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435, \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u0438\u0434 \u0447\u0442\u043e <code>Pin<\/code> <em>\u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442<\/em>. \u042f \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u0438\u0434, \u0447\u0442\u043e <code>Box::pin<\/code> \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <code>Box::new<\/code>, <code>Pin&lt;Box&lt;T&gt;&gt;<\/code> \u044d\u0442\u043e <code>Box&lt;T&gt;<\/code>, <code>Pin&lt;&amp;mut T&gt;<\/code> \u044d\u0442\u043e <code>&amp;mut T<\/code>, \u0430 <code>Pin&lt;Box&lt;T&gt;&gt;::as_mut<\/code> \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/boxed\/struct.Box.html#method.as_mut\">Box::as_mut<\/a>. <code>Pin<\/code> \u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c Rust, \u043d\u043e\u00a0\u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043c\u044b \u043f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u0435\u043c\u0441\u044f \u0432\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 future. \u041c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0440\u0430\u0437\u0434\u0435\u043b\u0435 Pin.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 <code>Poll<\/code>. \u042d\u0442\u043e <code>enum<\/code> \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">pub enum Poll&lt;T&gt; {     Ready(T),     Pending, }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code> &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u0438\u0431\u043e <code>Poll::Ready<\/code>, \u043b\u0438\u0431\u043e <code>Poll::Pending<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Ready<\/code> \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e future \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>Output<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u0435\u0441\u0442\u044c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>poll<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Pending<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e future \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 <code>poll<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e.<\/p>\n<p>\u0423 \u0432\u0430\u0441 \u043c\u043e\u0433 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: <em>\u0430 \u043a\u043e\u0433\u0434\u0430<\/em> \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e? \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e &#8212; \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f poll \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437 \u0437\u0430 \u0440\u0430\u0437\u043e\u043c \u0432 \u201c\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435\u201d \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 Wake.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0440\u0435\u0439\u0442\u0430 <code>Future<\/code> \u0443 <code>Foo<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>poll<\/code>. \u041a\u043e\u0434:<\/p>\n<pre><code class=\"rust\">impl Future for Foo {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if !self.started {             println!(\"start {}\", self.n);             self.started = true;         }         if self.sleep.as_mut().poll(context).is_pending() {             return Poll::Pending;         }         println!(\"end {}\", self.n);         Poll::Ready(())     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++if+self.sleep.as_mut%28%29.poll%28context%29.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #2<\/a><\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0435\u043b\u0438, \u0447\u0442\u043e\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 <code>poll<\/code>\u00a0\u0431\u044b\u043b\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 <code>Ready<\/code> \u0438\u043b\u0438 <code>Pending<\/code> \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0443 <code>poll<\/code> \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0430\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0430\u043c\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 future. \u0417\u0430\u0434\u0430\u0447\u0430 <code>Foo<\/code>\u00a0\u2014 \u0432\u044b\u0432\u043e\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430\u00a0\u044d\u043a\u0440\u0430\u043d \u0438 \u0443\u0445\u043e\u0434 \u0432\u00a0\u0441\u043e\u043d, \u0447\u0442\u043e\u00a0\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code>.<\/p>\n<p>\u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441: <code>poll<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e\u00a0\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430. \u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u00a0\u043b\u0438\u0431\u043e <code>Ready<\/code>,\u00a0\u043b\u0438\u0431\u043e <code>Pending<\/code>. \u042d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e future \u0437\u0430\u00a0\u0440\u0430\u0437. \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443, <code>Foo::poll<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e <code>Sleep::poll<\/code>\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c <a href=\"https:\/\/play.rust-lang.org\/?mode=release&amp;edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++let+started+%3D+false%3B%0A++++let+duration+%3D+Duration%3A%3Afrom_secs%281%29%3B%0A++++let+sleep+%3D+Box%3A%3Apin%28tokio%3A%3Atime%3A%3Asleep%28duration%29%29%3B%0A++++Foo+%7B+n%2C+started%2C+sleep+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A++++started%3A+bool%2C%0A++++sleep%3A+Pin%3CBox%3Ctokio%3A%3Atime%3A%3ASleep%3E%3E%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+%21self.started+%7B%0A++++++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++++++self.started+%3D+true%3B%0A++++++++%7D%0A++++++++let+before+%3D+Instant%3A%3Anow%28%29%3B%0A++++++++let+poll_result+%3D+self.sleep.as_mut%28%29.poll%28context%29%3B%0A++++++++let+duration+%3D+Instant%3A%3Anow%28%29+-+before%3B%0A++++++++println%21%28%22Sleep%3A%3Apoll+returned+%7Bpoll_result%3A%3F%7D+in+%7Bduration%3A%3F%7D.%22%29%3B%0A++++++++if+poll_result.is_pending%28%29+%7B%0A++++++++++++return+Poll%3A%3APending%3B%0A++++++++%7D%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/a> \u0438 \u0432\u044b\u0432\u043e\u0434, \u0442\u043e \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435. \u0412 \u00ab<a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++thread%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29%3B+%2F%2F+Oops%21%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+don%27t+run+at+the+same+time...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435<\/a>\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b\u0438 \u0432\u043e\u00a0\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438, <code>thread::sleep<\/code> \u043d\u0430\u0440\u0443\u0448\u0438\u043b\u0430 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043d\u0430\u0448\u0438\u0445 future. \u0415\u0441\u043b\u0438 \u043c\u044b <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Athread%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Afn+foo%28n%3A+u64%29+-%3E+Foo+%7B%0A++++Foo+%7B+n+%7D%0A%7D%0A%0Astruct+Foo+%7B%0A++++n%3A+u64%2C%0A%7D%0A%0Aimpl+Future+for+Foo+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++%2F%2F+This+version+never+returns+Pending%2C+so+self.started+isn%27t+necessary.%0A++++++++println%21%28%22start+%7B%7D%22%2C+self.n%29%3B%0A++++++++thread%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29%3B+%2F%2F+Oops%21%0A++++++++println%21%28%22end+%7B%7D%22%2C+self.n%29%3B%0A++++++++Poll%3A%3AReady%28%28%29%29%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+don%27t+run+at+the+same+time...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0432\u00a0Foo::poll<\/a>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u043e\u0442\u00a0\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043d\u0430 \u0432 <code>poll<\/code> \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0436\u0434\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442\u0430, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 future.<\/p>\n<p><code>Foo<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u043b\u0430\u0433 <code>started<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u0435\u00a0\u043b\u0438\u0448\u044c \u0440\u0430\u0437 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code>. \u0424\u043b\u0430\u0433 <code>ended<\/code> \u0432\u00a0\u0442\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 <code>poll<\/code> \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f <code>Ready<\/code>. \u0424\u043b\u0430\u0433 <code>started<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Foo<\/code> \u0432\u00a0\u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438. \u0412\u00a0\u0446\u0435\u043b\u043e\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0433\u043e\u2011\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0435\u0449\u0435 \u043f\u043e\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437\u00a0\u0442\u043e\u0447\u0435\u043a <code>.await<\/code>, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>poll<\/code> \u043c\u043e\u0433\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0441\u00a0\u043a\u0430\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u00ab\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u00bb. \u0415\u0441\u043b\u0438\u00a0\u0431\u044b \u0443\u00a0\u043d\u0430\u0441\u00a0\u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>enum<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>bool<\/code>. \u041f\u0440\u0438\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 <code>async fn<\/code> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0437\u0430\u00a0\u043d\u0430\u0441 \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f <code>async\/await<\/code> \u043a\u0430\u043a\u00a0\u0444\u0438\u0447\u0438 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<h2>Join<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u0442\u0435\u043c, \u043a\u0430\u043a\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 future, \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 <a href=\"https:\/\/docs.rs\/futures\/latest\/futures\/future\/fn.join_all.html\">join_all<\/a>. \u041c\u043e\u0436\u0435\u0442 \u0441\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e <code>join_all<\/code> \u0437\u0430\u00a0\u043a\u0443\u043b\u0438\u0441\u0430\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043a\u0430\u043a\u0443\u044e\u2011\u0442\u043e \u043c\u0430\u0433\u0438\u044e \u043f\u043e\u00a0\u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 <code>foo<\/code>, \u043d\u043e\u00a0\u043d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u0434\u043b\u044f\u00a0\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 <code>join_all<\/code> \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <\/p>\n<pre><code class=\"rust\">fn join_all&lt;F: Future&gt;(futures: Vec&lt;F&gt;) -&gt; JoinAll&lt;F&gt; {     JoinAll {         futures: futures.into_iter().map(Box::pin).collect(),     } }  struct JoinAll&lt;F&gt; {     futures: Vec&lt;Pin&lt;Box&lt;F&gt;&gt;&gt;, }  impl&lt;F: Future&gt; Future for JoinAll&lt;F&gt; {     type Output = ();      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, context: &amp;mut Context) -&gt; Poll&lt;()&gt; {         let is_pending = |future: &amp;mut Pin&lt;Box&lt;F&gt;&gt;| {             future.as_mut().poll(context).is_pending()         };         self.futures.retain_mut(is_pending);         if self.futures.is_empty() {             Poll::Ready(())         } else {             Poll::Pending         }     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3ADuration%3B%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++tokio%3A%3Atime%3A%3Asleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0Afn+join_all%3CF%3A+Future%3E%28futures%3A+Vec%3CF%3E%29+-%3E+JoinAll%3CF%3E+%7B%0A++++JoinAll+%7B%0A++++++++futures%3A+futures.into_iter%28%29.map%28Box%3A%3Apin%29.collect%28%29%2C%0A++++%7D%0A%7D%0A%0Astruct+JoinAll%3CF%3E+%7B%0A++++futures%3A+Vec%3CPin%3CBox%3CF%3E%3E%3E%2C%0A%7D%0A%0Aimpl%3CF%3A+Future%3E+Future+for+JoinAll%3CF%3E+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28mut+self%3A+Pin%3C%26mut+Self%3E%2C+context%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++let+is_pending+%3D+%7Cfuture%3A+%26mut+Pin%3CBox%3CF%3E%3E%7C+%7B%0A++++++++++++future.as_mut%28%29.poll%28context%29.is_pending%28%29%0A++++++++%7D%3B%0A++++++++self.futures.retain_mut%28is_pending%29%3B%0A++++++++if+self.futures.is_empty%28%29+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+join_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #3<\/a><\/p>\n<p>\u041e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435, \u043d\u0430\u0448\u0430 \u043d\u0435\u00a0\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f <code>join_all<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0443\u044e \u0442\u0440\u0435\u0439\u0442 <code>Future<\/code>, \u0433\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <code>Future::poll<\/code>. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u044f\u0442\u044c \u0435\u0441\u0442\u044c <code>Box::pin<\/code>, \u043d\u043e\u00a0\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0435\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 <code>poll<\/code> \u0432\u0441\u044e \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/vec\/struct.Vec.html#method.retain_mut\">Vec::retain_mut<\/a>. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>Vec<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 <code>false<\/code>. \u042d\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 future, \u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0438\u0435 <code>Ready<\/code>, \u0441\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u00ab\u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u00bb.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e. \u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0445 future \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a\u00a0\u043c\u0430\u0433\u0438\u044f, \u043d\u043e\u00a0\u043f\u043e\u00a0\u0441\u0443\u0442\u0438, \u0432\u0441\u0435 \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>poll<\/code> \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 <code>Vec<\/code>. \u042d\u0442\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u0430, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 poll\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e future \u043e\u0434\u043d\u0438\u043c \u0446\u0438\u043a\u043b\u043e\u043c.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u0448\u043e\u0440\u0442\u043a\u0430\u0442\u00a0\u2014 \u043c\u044b \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u044b\u0445 future. \u0412\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>join_all<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>foo<\/code>, \u043d\u0435\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u0447\u0435\u0433\u043e\u2011\u043b\u0438\u0431\u043e. \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f <code>join_all<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Vec&lt;F::Output&gt;<\/code>, \u0447\u0442\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f\u00a0\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f, \u043a\u0430\u043a\u00a0\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f<\/p>\n<h2>Sleep<\/h2>\n<p>\u041c\u044b \u043d\u0430\u00a0\u0432\u0435\u0440\u043d\u043e\u043c \u043f\u0443\u0442\u0438! \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0443\u00a0\u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>sleep<\/code>:<\/p>\n<pre><code class=\"rust\">fn sleep(duration: Duration) -&gt; Sleep {     let wake_time = Instant::now() + duration;     Sleep { wake_time } }  struct Sleep {     wake_time: Instant, }  impl Future for Sleep {     type Output = ();      fn poll(self: Pin&lt;&amp;mut Self&gt;, _: &amp;mut Context) -&gt; Poll&lt;()&gt; {         if Instant::now() &gt;= self.wake_time {             Poll::Ready(())         } else {             Poll::Pending         }     } }<\/code><\/pre>\n<p><a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+never+finish...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">Playground #4<\/a><\/p>\n<p>\u0425\u043c. \u041a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043e\u043a, \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>poll<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u0435\u0440\u043d\u043e, \u043d\u043e\u00a0\u043f\u0440\u0438\u00a0\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043e\u043d \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u00abstart\u00bb \u0438 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <a href=\"https:\/\/play.rust-lang.org\/?edition=2021&amp;code=use+futures%3A%3Afuture%3B%0Ause+std%3A%3Afuture%3A%3AFuture%3B%0Ause+std%3A%3Apin%3A%3APin%3B%0Ause+std%3A%3Atask%3A%3A%7BContext%2C+Poll%7D%3B%0Ause+std%3A%3Atime%3A%3A%7BDuration%2C+Instant%7D%3B%0A%0Afn+sleep%28duration%3A+Duration%29+-%3E+Sleep+%7B%0A++++let+wake_time+%3D+Instant%3A%3Anow%28%29+%2B+duration%3B%0A++++Sleep+%7B+wake_time+%7D%0A%7D%0A%0Astruct+Sleep+%7B%0A++++wake_time%3A+Instant%2C%0A%7D%0A%0Aimpl+Future+for+Sleep+%7B%0A++++type+Output+%3D+%28%29%3B%0A%0A++++fn+poll%28self%3A+Pin%3C%26mut+Self%3E%2C+_%3A+%26mut+Context%29+-%3E+Poll%3C%28%29%3E+%7B%0A++++++++if+Instant%3A%3Anow%28%29+%3E%3D+self.wake_time+%7B%0A++++++++++++println%21%28%22Sleep+ready%22%29%3B%0A++++++++++++Poll%3A%3AReady%28%28%29%29%0A++++++++%7D+else+%7B%0A++++++++++++println%21%28%22Sleep+pending%22%29%3B%0A++++++++++++Poll%3A%3APending%0A++++++++%7D%0A++++%7D%0A%7D%0A%0Aasync+fn+foo%28n%3A+u64%29+%7B%0A++++println%21%28%22start+%7Bn%7D%22%29%3B%0A++++sleep%28Duration%3A%3Afrom_secs%281%29%29.await%3B%0A++++println%21%28%22end+%7Bn%7D%22%29%3B%0A%7D%0A%0A%23%5Btokio%3A%3Amain%5D%0Aasync+fn+main%28%29+%7B%0A++++println%21%28%22These+jobs+never+finish...%22%29%3B%0A++++let+mut+futures+%3D+Vec%3A%3Anew%28%29%3B%0A++++for+n+in+1..%3D10+%7B%0A++++++++futures.push%28foo%28n%29%29%3B%0A++++%7D%0A++++let+joined_future+%3D+future%3A%3Ajoin_all%28futures%29%3B%0A++++joined_future.await%3B%0A%7D\">\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432\u044b\u0432\u043e\u0434\u0430<\/a>, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 <code>Sleep<\/code> \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u00a0\u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u0427\u0442\u043e\u00a0\u043c\u044b \u0443\u043f\u0443\u0441\u043a\u0430\u0435\u043c?<\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0443 <code>poll<\/code> <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html#tymethod.poll\">\u0442\u0440\u0438 \u0437\u0430\u0434\u0430\u0447\u0438<\/a>, \u0438 \u043f\u043e\u043a\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u0434\u0432\u0443\u043c\u044f. \u0412\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, <code>poll<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043d\u0435\u00a0\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044f\u0441\u044c. \u0417\u0430\u0442\u0435\u043c, <code>poll<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Ready<\/code>, \u0435\u0441\u043b\u0438 \u043e\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d, \u0438\u043b\u0438 <code>Pending<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442. \u041d\u043e, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 <code>poll<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>Pending<\/code>, \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u00ab\u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435\u00bb. \u0410\u0445, \u0432\u043e\u0442 \u0447\u0442\u043e\u00a0\u043c\u044b \u0437\u0430\u0431\u044b\u043b\u0438.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435\u00a0\u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u00a0\u044d\u0442\u0438\u043c, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e <code>Foo<\/code> \u0438 <code>JoinAll<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 <code>Pending<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u00abfuture\u00bb \u0443\u0436\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u0438\u043c <code>Pending<\/code>, \u0447\u0442\u043e\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e. \u041d\u043e <code>Sleep<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u00ableaf future\u00bb. \u0423\u00a0\u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 future \u043d\u0438\u0436\u0435 \u043f\u043e\u00a0\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438, \u0438 \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0443\u0434\u0438\u0442\u044c \u0441\u0435\u0431\u044f.<\/p>\n<h2>Wake<\/h2>\n<p>\u041f\u043e\u0440\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html\">Context<\/a>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u043c <code>context.waker()<\/code>, \u043e\u043d \u0432\u0435\u0440\u043d\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html\">Waker<\/a>. \u0412\u044b\u0437\u044b\u0432\u0430\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u0437\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake\">waker.wake()<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake_by_ref\">waker.wake_by_ref()<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0435\u0431\u044f<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-436734","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/436734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=436734"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/436734\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=436734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=436734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=436734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}