{"id":304629,"date":"2020-06-01T09:00:38","date_gmt":"2020-06-01T09:00:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=304629"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=304629","title":{"rendered":"\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0449\u0438\u043d\u0430 \u0432 Rust: \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 async\/.await"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/504020\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bb\/of\/xl\/bbofxlb7l5mmqv_ejwfybdcogvs.png\"><\/p>\n<p>  <\/p>\n<h1 id=\"vvedenie\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/www.rust-lang.org\/\" rel=\"nofollow\">Rust<\/a> \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0432 Rust, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0438\u0432\u0448\u0438\u0445 \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0443 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044e \u043d\u043e\u0440\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0441 \u0436\u0434\u0451\u0442 \u0446\u0435\u043b\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Rust, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inductive_reasoning\" rel=\"nofollow\">\u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435<\/a> \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Declarative_programming\" rel=\"nofollow\">\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c API \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0430\u043c \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>async\/.await<\/code>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"teoriya\">\u0422\u0435\u043e\u0440\u0438\u044f<\/h1>\n<p>  <\/p>\n<p>\u0414\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0441\u043e\u0431\u0438\u0435 \u043d\u0435\u0441\u0451\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440. \u0417\u0430 \u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c (\u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443):<\/p>\n<p>  <\/p>\n<ol>\n<li><a href=\"https:\/\/www.info.ucl.ac.be\/~pvr\/VanRoyChapter.pdf\" rel=\"nofollow\">&quot;Programming Paradigms for Dummies: What Every Programmer Should Know&quot;<\/a><\/li>\n<li>\u0425\u0430\u0431\u0440<br \/> \n<ol>\n<li><a href=\"https:\/\/habr.com\/en\/post\/201826\/\">&quot;\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c: \u043d\u0430\u0437\u0430\u0434 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u0435&quot;<\/a><\/li>\n<\/ol>\n<\/li>\n<li>Wikipedia<br \/> \n<ol>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Asynchronous_I\/O\" rel=\"nofollow\">&quot;Asynchronous I\/O&quot;<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Event_loop\" rel=\"nofollow\">&quot;Event Loop&quot;<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Reactor_pattern\" rel=\"nofollow\">&quot;Reactor pattern&quot;<\/a> &amp; <a href=\"https:\/\/en.wikipedia.org\/wiki\/Proactor_pattern\" rel=\"nofollow\">&quot;Proactor pattern&quot;<\/a><\/li>\n<\/ol>\n<\/li>\n<li><a href=\"http:\/\/www.kegel.com\/c10k.html\" rel=\"nofollow\">&quot;The C10K problem&quot;<\/a><\/li>\n<\/ol>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"std\">std<\/h1>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0431\u0437\u0430\u0432\u0435\u043b\u0430\u0441\u044c \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> \u0438 \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/index.html\" rel=\"nofollow\"><code>std::task<\/code><\/a>. \u042d\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0430\u043c\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u2014 <a href=\"https:\/\/tokio.rs\/\" rel=\"nofollow\">Tokio<\/a>, \u0440\u0435\u0447\u044c \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445), \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434.<\/p>\n<p>  <\/p>\n<p>\u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Closure_(computer_programming)\" rel=\"nofollow\">\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <em>\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c\u0443\u044e<\/em> \u043f\u043e\u0440\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 <em>\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c\u0443\u044e<\/em> \u043f\u043e\u0440\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0434\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e (\u043e\u0434\u043d\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0444\u0443\u0442\u0443\u0440\u0443, \u0444\u044c\u044e\u0447\u0435\u0440\u0441). \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f (\u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u043d\u0438\u0445, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f), \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u043f\u043e\u043c\u0438\u043c\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439\/\u0444\u0443\u043d\u043a\u0446\u0438\u0439).<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u0442\u0443\u0440\u044b:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ur\/pb\/wn\/urpbwninp--k2l9byrhwvno6syw.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>poll<\/code> \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cooperative_multitasking\" rel=\"nofollow\">\u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u0438<\/a>, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Context_switch\" rel=\"nofollow\">\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a>; \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440\u0443 (\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443), \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u043c\u043e\u0433 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430). \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u0444\u0443\u0442\u0443\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Thread_pool\" rel=\"nofollow\">\u043f\u0443\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432<\/a>, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u043e\u0439 <a href=\"https:\/\/tokio.rs\/\" rel=\"nofollow\">Tokio<\/a>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rd\/yc\/0q\/rdyc0qi1f5nbmbn7kje8tn-zk_o.png\"><\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li>\n<p>\u041f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u041e\u0421 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u041e\u0421 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u043c \u044f\u0434\u0440\u0430\u043c \u043d\u0435\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0430\u044f, \u0442.\u0435. \u043e\u0434\u043d\u0430 \u0444\u0443\u0442\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u041e\u0421, \u0430 \u043f\u043e\u0442\u043e\u043a\u0438 \u041e\u0421 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u044f\u0434\u0440\u0430\u043c.<\/p>\n<p>  <\/li>\n<li>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043d\u0435 &quot;\u0444\u0443\u0442\u0443\u0440\u044b&quot;, \u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_threads\" rel=\"nofollow\">\u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438<\/a>, \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0442\u0430\u0441\u043a\u0438, \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <\/li>\n<\/ul>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html#panics\" rel=\"nofollow\">\u043d\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439<\/a> \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code>poll<\/code>, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430, \u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0435\u0433\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/enum.Poll.html#variant.Ready\" rel=\"nofollow\"><code>Poll::Ready(Output)<\/code><\/a>: \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0430\u043d\u0438\u043a\u043e\u0432\u0430\u0442\u044c, \u0432\u043e\u0439\u0442\u0438 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e (\u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439), \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0444\u0443\u0442\u0443\u0440\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0430\u043c\u0430 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 <code>poll<\/code> \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c <code>unsafe<\/code> \u043d\u0435 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430. \u041d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043b\u0438\u0448\u0451\u043d\u043d\u044b\u0435 \u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a>, \u2014 \u044d\u0442\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f). \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0435\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u043c\u0443 \u044f\u0432\u043b\u0435\u043d\u0438\u044e \u2014 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c (\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442) <a href=\"https:\/\/en.wikipedia.org\/wiki\/First-class_citizen\" rel=\"nofollow\">\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/a>, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 Rust \u2014 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Higher-order_programming\" rel=\"nofollow\">\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0418\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0448\u0435 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html\" rel=\"nofollow\"><code>Waker<\/code><\/a>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0435\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"writefuture\">WriteFuture<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0432\u043e\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>WriteFuture<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c\u0443 TCP \u0441\u043e\u043a\u0435\u0442\u0443.<\/p>\n<p>  <\/p>\n<p>[<a href=\"https:\/\/gist.github.com\/2f2040d1639bebf723924a73aaa262e7\" rel=\"nofollow\">https:\/\/gist.github.com\/2f2040d1639bebf723924a73aaa262e7<\/a>]<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::{     future::Future,     io::{self, Read, Write},     net::{TcpListener, TcpStream},     pin::Pin,     task::{Context, Poll},     thread::{self, JoinHandle}, };  use tokio::runtime::Runtime;  struct WriteFuture&lt;'a&gt; {     socket: TcpStream,     data: &amp;'a [u8], }  impl&lt;'a&gt; WriteFuture&lt;'a&gt; {     #[allow(dead_code)]     fn new(socket: TcpStream, data: &amp;'a [u8]) -&gt; Self {         socket.set_nonblocking(true).unwrap();         Self { socket, data }     } }  impl Future for WriteFuture&lt;'_&gt; {     type Output = io::Result&lt;usize&gt;;      fn poll(mut self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context) -&gt; Poll&lt;Self::Output&gt; {         let data = self.data;          match self.socket.write(data) {             Ok(length) =&gt; Poll::Ready(Ok(length)),             Err(err) if err.kind() == io::ErrorKind::WouldBlock =&gt; {                 cx.waker().wake_by_ref();                 Poll::Pending             }             Err(err) =&gt; Poll::Ready(Err(err)),         }     } }  fn main() {     let server = run_server();     let client = run_client();      server.join().unwrap();     client.join().unwrap(); }  const ADDR: &amp;'static str = &quot;127.0.0.1:18373&quot;;  fn run_server() -&gt; JoinHandle&lt;()&gt; {     thread::spawn(|| {         let listener = TcpListener::bind(ADDR).unwrap();          let (mut client_accepted, _addr) = listener.accept().unwrap();          let mut message = String::new();         client_accepted.read_to_string(&amp;mut message).unwrap();         dbg!(message);     }) }  fn run_client() -&gt; JoinHandle&lt;()&gt; {     thread::spawn(|| {         let client = TcpStream::connect(ADDR).unwrap();          let mut rt = Runtime::new().unwrap();         rt.block_on(WriteFuture::new(client, b&quot;Hello, world!&quot;)).unwrap();     }) }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u041d\u0430\u0448\u0430 <code>WriteFuture<\/code> \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u0438\u043d \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>self.socket.write(data)<\/code> \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432 \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 \u0432 <code>WriteFuture::poll<\/code>. \u041a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u2014 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[src\/main.rs:60] message = &quot;Hello, world!&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <code>WriteFuture::poll<\/code>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c <code>self.socket.write(data)<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p><strong>\u0412\u0435\u0442\u043a\u0430 \u043f\u0435\u0440\u0432\u0430\u044f.<\/strong> \u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c <code>Poll::Ready(Ok(length))<\/code>. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/li>\n<li>\n<p><strong>\u0412\u0435\u0442\u043a\u0430 \u0432\u0442\u043e\u0440\u0430\u044f.<\/strong> \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/enum.ErrorKind.html#variant.WouldBlock\" rel=\"nofollow\"><code>io::ErrorKind::WouldBlock<\/code><\/a>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e, \u0431\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0434\u0430\u0451\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440\u0443, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0444\u0443\u0442\u0443\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0435\u0449\u0451 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/li>\n<li>\n<p><strong>\u0412\u0435\u0442\u043a\u0430 \u0442\u0440\u0435\u0442\u044c\u044f.<\/strong> \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0443, \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u043e\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/enum.ErrorKind.html#variant.WouldBlock\" rel=\"nofollow\"><code>io::ErrorKind::WouldBlock<\/code><\/a>. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0438. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0443 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u0447 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u0442\u0443\u0440, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u043b\u0438\u0431\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430. \u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441, \u0437\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xa\/vz\/lm\/xavzlmlk1gv1iio1nh5ofkmydyw.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u0430\u044f \u0444\u0443\u0442\u0443\u0440\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0439 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 (\u0440\u0430\u0437\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u0430), \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>poll<\/code>, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c, \u043e\u043d\u0430 &quot;\u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f&quot;. <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html\" rel=\"nofollow\"><code>Waker<\/code><\/a> \u2014 \u044d\u0442\u043e \u0440\u0443\u0447\u043a\u0430 \u043e\u0442 \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440\u0430 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e: \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0444\u0443\u0442\u0443\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake_by_ref\" rel=\"nofollow\"><code>.wake_by_ref()<\/code><\/a>\/<a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html#method.wake\" rel=\"nofollow\"><code>.wake()<\/code><\/a> \u043d\u0430 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0441 \u0444\u0443\u0442\u0443\u0440\u043e\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Waker.html\" rel=\"nofollow\"><code>Waker<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.Context.html#method.waker\" rel=\"nofollow\"><code>cx.waker()<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 poll \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0436\u0435 \u0432\u0441\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>poll<\/code> \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u0422\u0430\u043a\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0426\u041f\u0423 \u043d\u0430 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043e\u043f\u0440\u043e\u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0432\u0435\u0434\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u043e\u043a\u0435\u0442 (\u0430 \u043d\u0435 \u043d\u0430\u0448\u0430 \u043f\u0430\u0440\u043e\u0434\u0438\u044f) \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u044c\/\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (<a href=\"https:\/\/www.man7.org\/linux\/man-pages\/man2\/epoll_ctl.2.html\" rel=\"nofollow\">epoll<\/a>, <a href=\"https:\/\/man.openbsd.org\/kqueue.2\" rel=\"nofollow\">kqueue<\/a>, &#8230;) \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u0437 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043a\u0442\u043e \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440\u0430 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0444\u0443\u0442\u0443\u0440\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0435\u0451 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u0441\u0430\u043c\u043e\u043c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Event_loop\" rel=\"nofollow\">\u0446\u0438\u043a\u043b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/a> (\u0438\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0438\u043c) \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0445 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0442 \u041e\u0421.<\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 <code>fn run_client<\/code> \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u0444\u0443\u0442\u0443\u0440\u0443 <code>WriteFuture<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">let mut rt = Runtime::new().unwrap(); rt.block_on(WriteFuture::new(client, b&quot;Hello, world!&quot;));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0430\u043c <a href=\"https:\/\/docs.rs\/tokio\/0.2.21\/tokio\/runtime\/struct.Runtime.html\" rel=\"nofollow\"><code>\u0440\u0430\u043d\u0442\u0430\u0439\u043c Tokio<\/code><\/a>, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u041e\u0421 (\u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0442\u0435\u043b\u043e <code>fn run_client<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/thread\/fn.spawn.html\" rel=\"nofollow\"><code>thread::spawn<\/code><\/a>) \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f <code>WriteFuture<\/code>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/tokio\/0.2.21\/tokio\/runtime\/struct.Runtime.html#method.block_on\" rel=\"nofollow\"><code>block_on<\/code><\/a> \u2014 \u044d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c, \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 (\u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435).<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"asyncawait\">async\/.await<\/h1>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0438\u0445 \u0441\u0443\u043c\u043c\u0443? \u0422\u0440\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439\/\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\/\u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435\/\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443, \u0437\u0430\u0442\u0435\u043c \u0442\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443.<\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u044f \u0444\u0443\u0442\u0443\u0440 \u0438 \u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0438 \u0432 [<code>Future::poll<\/code>];<\/li>\n<li>\u0410\u0434\u0430\u043f\u0442\u043e\u0440\u044b;<\/li>\n<li>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>async<\/code>\/<code>.await<\/code>.<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"variant-1-ruchnoe-upravlenie\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u21161 (\u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435)<\/h2>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"rust\">use std::{     future::Future,     ops::AddAssign,     pin::Pin,     task::{Context, Poll}, };  use pin_project::pin_project;  #[pin_project] struct CompoundFuture&lt;Fut1, Fut2, Fut3, F, U&gt; {     fut1: Option&lt;Fut1&gt;,     fut2: Option&lt;Fut2&gt;,     fut3: Fut3,     f: F,     result: Option&lt;U&gt;, }  impl&lt;Fut1, Fut2, Fut3, F, U, T&gt; CompoundFuture&lt;Fut1, Fut2, Fut3, F, U&gt; where     Fut1: Future&lt;Output = T&gt;,     Fut2: Future&lt;Output = T&gt;,     Fut3: Future&lt;Output = T&gt;,     F: FnMut(T) -&gt; U, {     #[allow(dead_code)]     fn new(fut1: Fut1, fut2: Fut2, fut3: Fut3, f: F) -&gt; Self {         Self {             fut1: Some(fut1),             fut2: Some(fut2),             fut3,             f,             result: None,         }     } }  impl&lt;Fut1, Fut2, Fut3, F, T, U&gt; Future for CompoundFuture&lt;Fut1, Fut2, Fut3, F, U&gt; where     Fut1: Future&lt;Output = T&gt;,     Fut2: Future&lt;Output = T&gt;,     Fut3: Future&lt;Output = T&gt;,     F: FnMut(T) -&gt; U,     U: AddAssign, {     type Output = U;      fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context) -&gt; Poll&lt;Self::Output&gt; {         let this = self.project();          if let Some(fut1) = this.fut1 {             \/\/ SAFETY: Pin::new_unchecked is safe because             \/\/ we won't move fut1 (fut2, fut3)             match unsafe { Pin::new_unchecked(fut1) }.poll(cx) {                 Poll::Pending =&gt; return Poll::Pending,                 Poll::Ready(x) =&gt; {                     *this.result = Some((this.f)(x));                     *this.fut1 = None;                 }             }         }          if let Some(fut2) = this.fut1 {             match unsafe { Pin::new_unchecked(fut2) }.poll(cx) {                 Poll::Pending =&gt; return Poll::Pending,                 Poll::Ready(x) =&gt; {                     let result = this.result.as_mut().unwrap();                     *result += (this.f)(x);                     *this.fut2 = None;                 }             }         }          match unsafe { Pin::new_unchecked(this.fut3) }.poll(cx) {             Poll::Pending =&gt; Poll::Pending,             Poll::Ready(x) =&gt; {                 let result = this.result.as_mut().unwrap();                 *result += (this.f)(x);                 Poll::Ready(this.result.take().unwrap())             }         }     } }<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"variant-2-adaptory\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u21162 (\u0430\u0434\u0430\u043f\u0442\u043e\u0440\u044b)<\/h2>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::ops::AddAssign;  use futures::Future;  fn compound_future&lt;'a, Fut1, Fut2, Fut3, T, U, F&gt;(     fut1: Fut1,     fut2: Fut2,     fut3: Fut3,     mut f: F, ) -&gt; impl Future&lt;Item = U, Error = ()&gt; + 'a where     Fut1: Future&lt;Item = T, Error = ()&gt; + 'a,     Fut2: Future&lt;Item = T, Error = ()&gt; + 'a,     Fut3: Future&lt;Item = T, Error = ()&gt; + 'a,     F: FnMut(T) -&gt; U + 'a,     U: AddAssign, {         fut1.join3(fut2, fut3).map(move |(a, b, c)| {                 let mut result = f(a);                 result += f(b);                 result += f(c);                 result         }) }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0412 \u043a\u043e\u0434\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f <code>futures = &quot;0.1&quot;<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0442\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0430\u044f, \u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"variant-3-asyncawait\">\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u21163 (async\/.await)<\/h2>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::{future::Future, ops::AddAssign};  async fn compound_future&lt;Fut1, Fut2, Fut3, T, U, F&gt;(     fut1: Fut1,     fut2: Fut2,     fut3: Fut3,     mut f: F, ) -&gt; U where     Fut1: Future&lt;Output = T&gt;,     Fut2: Future&lt;Output = T&gt;,     Fut3: Future&lt;Output = T&gt;,     F: FnMut(T) -&gt; U,     U: AddAssign, {     let mut result = f(fut1.await);     result += f(fut2.await);     result += f(fut3.await);     result }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"analiz\">\u0410\u043d\u0430\u043b\u0438\u0437<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 <code>CompoundFuture<\/code> \u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>poll<\/code> \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0447\u0440\u0435\u0432\u0430\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438, \u0432\u0435\u0434\u044c \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0451 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Finite-state_machine\" rel=\"nofollow\">\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430<\/a> \u0438\u0437 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> (\u0447\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438) \u0438 \u043c\u043d\u043e\u0433\u043e-\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043a\u043e\u0434\u0430. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435, \u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0442.\u043a. \u043e\u043d \u0432\u0441\u0451 \u0435\u0449\u0451 <a href=\"https:\/\/docs.rs\/futures-util\/0.3.1\/src\/futures_util\/future\/either.rs.html\" rel=\"nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f<\/a> \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043e\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a (<a href=\"https:\/\/docs.rs\/futures\/0.3.1\/futures\/\" rel=\"nofollow\">futures<\/a>, <a href=\"https:\/\/tokio.rs\/\" rel=\"nofollow\">Tokio<\/a> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445).<\/p>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0432 24 \u0441\u0442\u0440\u043e\u043a\u0438, \u0447\u0442\u043e \u0432 3.5 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441 \u0440\u0443\u0447\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0440\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043a\u0438, \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u043e\u0432 (\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u0432). \u0414\u0430\u0434\u0438\u043c \u043d\u0435\u0441\u0442\u0440\u043e\u0433\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u0430\u043c:<\/p>\n<p>  <\/p>\n<blockquote><p>\u0410\u0434\u0430\u043f\u0442\u043e\u0440\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043d\u0430 \u0442\u0438\u043f\u0435 <code>Fut1<\/code>, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0435 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u043c\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435) <code>Fut1<\/code> \u0432 <code>Fut2&lt;..., Fut1, ...&gt;<\/code>, \u0433\u0434\u0435 <code>Fut1: Future, Fut2: Future<\/code>.<\/p><\/blockquote>\n<p>\u041f\u0443\u0442\u0451\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0444\u043e\u0440\u043c\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lazy_evaluation\" rel=\"nofollow\">\u043b\u0435\u043d\u0438\u0432\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/a>), \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/futures\/0.1.29\/futures\/future\/trait.Future.html#method.join3\" rel=\"nofollow\"><code>futures::future::Future::join3<\/code><\/a> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u0442\u0443\u0440\u0443, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0443\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0440\u0451\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0430 <a href=\"https:\/\/docs.rs\/futures\/0.1.29\/futures\/future\/trait.Future.html#method.map\" rel=\"nofollow\"><code>futures::future::Future::map<\/code><\/a> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u0442\u0443\u0440\u0443, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u0442\u0443\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0432\u0441\u0451 \u0433\u043b\u0430\u0434\u043a\u043e \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u043d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0442\u0438\u043f\u0430\u0445 \u0432 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">= note: expected type ()         found type futures::future::and_then::AndThen&lt;futures::stream::concat::Concat2&lt;hyper::body::body::Body&gt;, futures::future::or_else::OrElse&lt;futures::future::map::Map&lt;futures::future::and_then::AndThen&lt;futures::future::and_then::AndThen&lt;futures::future::map_err::MapErr&lt;futures::future::result_::FutureResult&lt;contract::Update, serde_json::error::Error&gt;, [closure@src\\main.rs:139:22: 144:14]&gt;, std::result::Result&lt;(contract::User, std::string::String, i64, i64), http::response::Response&lt;hyper::body::body::Body&gt;&gt;, [closure@src\\main.rs:145:23: 162:14]&gt;, futures::future::map_err::MapErr&lt;futures::future::and_then::AndThen&lt;impl futures::future::Future, futures::future::either::Either&lt;futures::future::and_then::AndThen&lt;impl futures::future::Future, futures::future::either::Either&lt;futures::future::then::Then&lt;impl futures::future::Future, futures::future::either::Either&lt;impl futures::future::Future, futures::future::result_::FutureResult&lt;(), telegram_client::TelegramClientError&gt;&gt;, [closure@src\\main.rs:211:51: 224:46 telegram_client:_, chat_id:_, text:_]&gt;, futures::future::result_::FutureResult&lt;(), telegram_client::TelegramClientError&gt;&gt;, [closure@src\\main.rs:173:90: 230:30 file_id:_, ext:_, user:_, message_id:_, dbs:_, chat_id:_, telegram_client:_]&gt;, futures::future::result_::FutureResult&lt;(), telegram_client::TelegramClientError&gt;&gt;, [closure@src\\main.rs:166:31: 235:22 user:_, chat_id:_, message_id:_, telegram_client:_, file_id:_, dbs:_]&gt;, [closure@src\\main.rs:236:30: 242:22]&gt;, [closure@src\\main.rs:163:23: 243:14 telegram_client:_, dbs:_]&gt;, [closure@src\\main.rs:245:18: 248:14]&gt;, std::result::Result&lt;http::response::Response&lt;hyper::body::body::Body&gt;, hyper::error::Error&gt;, fn(http::response::Response&lt;hyper::body::body::Body&gt;) -&gt; std::result::Result&lt;http::response::Response&lt;hyper::body::body::Body&gt;, hyper::error::Error&gt; {std::result::Result&lt;http::response::Response&lt;hyper::body::body::Body&gt;, hyper::error::Error&gt;::Ok}&gt;, [closure@src\\main.rs:136:54: 250:6 telegram_client:_, dbs:_]&gt;<\/code><\/pre>\n<p>  <\/p>\n<p>[\u0412\u0437\u044f\u0442\u043e <a href=\"https:\/\/habr.com\/en\/company\/bitrix\/blog\/477342\/#comment_20941832\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>]<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u044b \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0442 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043e\u0431\u0449\u0451\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0430\u0434\u0430\u043f\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043d\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439, \u043b\u0430\u0439\u0444\u0442\u0430\u0439\u043c\u0430\u043c\u0438 \u0438 \u043f\u043e\u043b\u043d\u044b\u043c\u0438 \u043f\u0443\u0442\u044f\u043c\u0438 (\u0447\u0442\u043e \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u044b\u0448\u0435).<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>async<\/code>\/<code>.await<\/code>, \u0441\u0438\u043b\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 (<code>async fn<\/code>, <code>async { ... }<\/code> \u0438\u043b\u0438 <code>async move { ... }<\/code>) \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a>, \u0430 <code>fut.await<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0436\u0434\u0451\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>fut<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>poll<\/code> \u043a\u043e\u0434, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 <code>fut.await<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u043a\u0430 <code>fut<\/code> \u043d\u0435 \u0432\u0435\u0440\u043d\u0451\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/enum.Poll.html#variant.Ready\" rel=\"nofollow\"><code>Poll::Ready(Output)<\/code><\/a>. \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 (\u043d\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f). \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043e\u043a \u043a\u043e\u0434\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043d\u0435\u044f\u0432\u043d\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0432\u0435\u0441 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441\u043b\u0430\u0438\u0432\u0430\u044e\u0442 \u0438\u0445 \u0434\u0440\u0443\u0433 \u043d\u0430 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e <code>async<\/code>\/<code>.await<\/code> \u043d\u0430\u0434 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u043d\u044b\u043c\/\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 &quot;\u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438&quot; <code>.await<\/code> \u2014 \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u0434\u0430 \u0432 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u044b\u0440\u044b\u0445 (\u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0445) \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"alternativnye-vzglyady-na-problemu\">\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u044b \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443<\/h1>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0438 \u0441 \u043b\u044e\u0431\u044b\u043c \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u0434\u0438\u0437\u0430\u0439\u043d\u0435 \u044f\u0437\u044b\u043a\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u0449\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0442\u0438\u043f\u043e\u0432, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0445 \u043c\u043d\u0435\u043d\u0438\u0439. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0442\u0438\u0432 <code>async<\/code>\/<code>.await<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p><strong>\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/strong>. \u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>async<\/code>\/<code>.await<\/code> \u043d\u0430\u0447\u0430\u043b\u0438\u0441\u044c \u0435\u0449\u0451 <a href=\"https:\/\/github.com\/rust-lang\/rfcs\/pull\/2394\" rel=\"nofollow\">\u0432 2018 \u0433\u043e\u0434\u0443<\/a> (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0430\u043d\u044c\u0448\u0435), \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0441\u0442\u0430\u0440\u044b\u043c \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c \u0441 \u0430\u0434\u0430\u043f\u0442\u043e\u0440\u0430\u043c\u0438\/\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0430\u043c\u0438 (\u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Scala, Java, &#8230;) \u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0445\u043e\u0434\u0447\u0438\u0432\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0432 \u0442\u0438\u043f\u0430\u0445, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 \u0440\u044f\u0434\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0441\u0442 (\u0442\u0435 \u0436\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0441\u0442\u0440\u0438\u043c\u044b (\u0440\u0435\u0447\u044c \u043e \u043d\u0438\u0445 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445)).<\/p>\n<p>  <\/li>\n<li>\n<p><strong>\u041d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430<\/strong>. <code>Future<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monad_(functional_programming)\" rel=\"nofollow\">\u043c\u043e\u043d\u0430\u0434\u043e\u0439<\/a>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0431\u044b \u043d\u0430\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monad_(functional_programming)#Do-notation\" rel=\"nofollow\">do-\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/a>, \u0432 \u043f\u0440\u043e\u0447\u0435\u043c, \u043a\u0430\u043a \u0438 \u0441 <code>Result<\/code>, <code>Option<\/code>, <code>Either<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Rust \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <strong>\u043f\u043e-\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438<\/strong> \u0431\u0435\u0437 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Kind_(type_theory)\" rel=\"nofollow\"><strong>HKT<\/strong> \u2014 <strong>H<\/strong>igher-<strong>K<\/strong>inded <strong>T<\/strong>ypes<\/a>. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/en\/users\/PsyHaSTe\/\">\u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0416\u0443\u043a\u043e\u0432\u0441\u043a\u043e\u0433\u043e<\/a> <a href=\"https:\/\/habr.com\/en\/post\/490112\/\">&quot;\u041c\u043e\u043d\u0430\u0434\u044b \u043a\u0430\u043a \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430&quot;<\/a>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u0442\u0435\u043c\u0430 HKT, \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/smallcultfollowing.com\/babysteps\/blog\/2016\/11\/04\/associated-type-constructors-part-3-what-higher-kinded-types-might-look-like\/\" rel=\"nofollow\">&quot;Associated type constructors, part 3: What higher-kinded types might look like&quot;<\/a><\/li>\n<li><a href=\"https:\/\/varkor.github.io\/blog\/2019\/03\/28\/idiomatic-monads-in-rust.html\" rel=\"nofollow\">&quot;Idiomatic monads in Rust&quot;<\/a><\/li>\n<li><a href=\"https:\/\/sdleffler.github.io\/RustTypeSystemTuringComplete\/\" rel=\"nofollow\">&quot;Rust&#8217;s Type System is Turing-Complete&quot;<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/JasonShin\/fp-core.rs\" rel=\"nofollow\">fp-core.rs \u2014 A library for functional programming in Rust<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/lloydmeta\/frunk\" rel=\"nofollow\">frunk \u2014 Funktional generic type-level programming in Rust: HList, Coproduct, Generic, LabelledGeneric, Validated, Monoid and friends<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"async-move----ili-async----\">async move {\u2026 } \u0438\u043b\u0438 async {\u2026 } ?<\/h1>\n<p>  <\/p>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043c\u0435\u0436\u0434\u0443 <code>async move { ... }<\/code> \u0438 <code>async { ... }<\/code> \u043c\u043e\u0436\u0435\u0442 \u0441\u043f\u0435\u0440\u0432\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439, \u0432\u0435\u0434\u044c \u0443 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 (<code>{ ... }<\/code>) \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 move-\u0430\u043d\u0430\u043b\u043e\u0433\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u0441 <code>move<\/code>) \u043e\u0432\u043b\u0430\u0434\u0435\u0432\u0430\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u0431\u0435\u0437 <code>move<\/code>) \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0443 \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u2014 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0438 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u2014 \u043e\u0432\u043b\u0430\u0434\u0435\u0432\u0430\u0435\u0442 (\u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0432 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0442\u0440\u0435\u0439\u0442 <code>Future<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>foo()<\/code> \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 <code>abc<\/code> \u043d\u0430 \u044d\u043a\u0440\u0430\u043d:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">async fn foo() {     let string = String::from(&quot;abc&quot;);      async { dbg!(&amp;string); }.await;     async { dbg!(&amp;string); }.await; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430 \u0437\u0430\u043d\u044f\u043b\u0438 <code>string<\/code>. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>move<\/code> \u043f\u043e\u0441\u043b\u0435 \u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e <code>async<\/code>, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u043a\u0430\u043a \u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0432\u0435\u0434\u044c <code>async move { ... }<\/code> \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f <strong>\u0441\u0440\u0430\u0437\u0443<\/strong> \u043e\u0432\u043b\u0430\u0434\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0382]: use of moved value: `string`  --&gt; src\/lib.rs:5:16   | 2 |     let string = String::from(&quot;abc&quot;);   |         ------ move occurs because `string` has type `std::string::String`, which does not implement the `Copy` trait 3 |      4 |     async move { dbg!(&amp;string); }.await;   |                ------------------   |                |       |   |                |       variable moved due to use in generator   |                value moved here 5 |     async move { dbg!(&amp;string); }.await;   |                ^^^^^^^^------^^^^   |                |       |   |                |       use occurs due to use in generator   |                value used here after move<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">async fn foo() -&gt; String {     let string = String::from(&quot;abc&quot;);      async { string }.await }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043d\u0435 \u0441\u043c\u043e\u0433 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c <code>string<\/code> \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e \u0438 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e, \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0438\u043b \u0441\u0432\u043e\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e (\u0443\u0434\u0430\u0447\u043d\u0443\u044e) \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u2014 \u043e\u0432\u043b\u0430\u0434\u0435\u043b \u0435\u0439. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>move<\/code>, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0435\u043c \u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">async fn foo() {     let mut string = String::from(&quot;abc&quot;);      async { string.push_str(&quot;def&quot;); }.await;      dbg!(string); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, \u0432\u0435\u0434\u044c \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0443 <a href=\"https:\/\/doc.rust-lang.org\/std\/string\/struct.String.html#method.push_str\" rel=\"nofollow\"><code>String::push_str<\/code><\/a> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>&amp;mut self<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u0443\u0435\u043c \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e \u2014 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c <code>move<\/code>, \u0442\u043e, \u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0432\u0435\u0434\u044c \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u043e\u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <code>dbg!<\/code>, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f <code>string<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0382]: use of moved value: `string`  --&gt; src\/lib.rs:6:10   | 2 |     let mut string = String::from(&quot;abc&quot;);   |         ---------- move occurs because `string` has type `std::string::String`, which does not implement the `Copy` trait 3 |      4 |     async move { string.push_str(&quot;def&quot;); }.await;   |                ---------------------------   |                | |   |                | variable moved due to use in generator   |                value moved here 5 |      6 |     dbg!(string);   |          ^^^^^^ value used here after move<\/code><\/pre>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"asinhronnye-zamykaniya\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f?<\/h1>\n<p>  <\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     let closure = async || {         dbg!();     }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">error[E0658]: async closures are unstable  --&gt; src\/main.rs:2:19   | 2 |     let closure = async || {   |                   ^^^^^   |   = note: see issue #62290 &lt;https:\/\/github.com\/rust-lang\/rust\/issues\/62290&gt; for more information<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0435\u0449\u0451 \u043d\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c (<a href=\"https:\/\/github.com\/rust-lang\/rust\/issues\/62290\" rel=\"nofollow\">RFC<\/a>). \u041d\u0435 \u043f\u0443\u0442\u0430\u0439\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u0435\u0440\u0432\u043e\u0435 \u2014 <code>async [move] |...| { ... }<\/code> (\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435)<\/li>\n<li>\u0412\u0442\u043e\u0440\u043e\u0435 \u2014 <code>|...| async [move] { ... }<\/code> (\u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435)<\/li>\n<\/ul>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"pin\">Pin<\/h1>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html#tymethod.poll\" rel=\"nofollow\"><code>Future::poll<\/code><\/a> \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>self: Pin&lt;&amp;mut Self&gt;<\/code>. \u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442? \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0447\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0433\u0434\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f (\u0432\u0437\u044f\u0442\u043e <a href=\"https:\/\/rust-lang.github.io\/async-book\/04_pinning\/01_chapter.html\" rel=\"nofollow\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">async {     let mut x = [0; 128];     let read_into_buf_fut = read_into_buf(&amp;mut x);     read_into_buf_fut.await;     println!(&quot;{:?}&quot;, x); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">struct ReadIntoBuf&lt;'a&gt; {     buf: &amp;'a mut [u8], \/\/ \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 `x` \u0441\u043d\u0438\u0437\u0443 }  struct AsyncFuture {     x: [u8; 128],     read_into_buf_fut: ReadIntoBuf&lt;'self&gt;, }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u041b\u0430\u0439\u0444\u0442\u0430\u0439\u043c <code>'self<\/code> \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435, \u043d\u043e \u0432 \u0446\u0435\u043b\u044f\u0445 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 <code>read_into_buf_fut: ReadIntoBuf&lt;'self&gt;<\/code>. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u0436\u0438\u0432\u0451\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0441\u0430\u043c\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>AsyncFuture<\/code>.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 <code>AsyncFuture<\/code> \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 <code>read_into_buf_fut.buf<\/code> \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f (\u0441\u0442\u0430\u043d\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435), \u0447\u0442\u043e <a href=\"https:\/\/doc.rust-lang.org\/nomicon\/what-unsafe-does.html\" rel=\"nofollow\">\u0432\u044b\u0437\u043e\u0432\u0435\u0442 UB<\/a>. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u2014 \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 <code>self: Pin&lt;&amp;mut Self&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p><code>Pin<\/code> \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u044e\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0442\u0435\u043c\u043e\u0439 \u0432 Rust, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u0421\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/pin\/index.html\" rel=\"nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h1 id=\"itog\">\u0418\u0442\u043e\u0433<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> \u2014 \u0442\u0440\u0435\u0439\u0442 \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 (\u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445) \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Polling_(computer_science)\" rel=\"nofollow\">poll-based<\/a> \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041e\u0431\u044a\u0435\u043a\u0442\u044b <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html\" rel=\"nofollow\"><code>Future<\/code><\/a> \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/First-class_citizen\" rel=\"nofollow\">\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/a>: \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043d\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u043c \u0432\u0437\u0434\u0443\u043c\u0430\u0435\u0442\u0441\u044f, \u0430 \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u043e\u043d\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u2014 \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/future\/trait.Future.html#tymethod.poll\" rel=\"nofollow\"><code>Future::poll<\/code><\/a> \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u0435\u0440\u043d\u0451\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/enum.Poll.html#variant.Ready\" rel=\"nofollow\"><code>Poll::Ready(Output)<\/code><\/a>. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u044d\u043a\u0437\u0435\u043a\u044c\u044e\u0442\u043e\u0440\u043e\u043c (\u0438\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c).<\/p>\n<p>  <\/p>\n<p><code>async<\/code>\/<code>.await<\/code> \u0432 Rust \u2014 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0441\u044f \u0442\u0430\u043a, \u0431\u0443\u0434\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>async<\/code>, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043b\u0438\u0431\u043e \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u043b\u0438\u0431\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0442.\u0435. \u043d\u0435\u0447\u0442\u043e, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0435\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>await<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043f\u043e\u043b\u0435, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0444\u0443\u0442\u0443\u0440\u0443 <code>fut<\/code> (<code>fut.await<\/code>). \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f <code>fut<\/code>. \u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 \u2014 <a href=\"https:\/\/docs.rs\/futures\/0.1.29\/futures\/future\/trait.Future.html#method.and_then\" rel=\"nofollow\"><code>futures::Future::and_then<\/code><\/a> (futures 0.1.x).<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u2014 \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u0442\u0443\u0440\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434: \u043f\u0440\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <a href=\"https:\/\/tokio.rs\/\" rel=\"nofollow\">Tokio<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"blagodarnosti\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h1>\n<p>  <\/p>\n<p>\u0417\u0430 \u0440\u0435\u0432\u044c\u044e \u0441\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/github.com\/blandger\" rel=\"nofollow\">@blandger<\/a>, \u0442\u0430\u043a\u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043b\u044e\u0434\u044f\u043c \u0437\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0447\u0430\u0442\u0435 <a href=\"https:\/\/t.me\/rust_async\" rel=\"nofollow\">@rust_async<\/a>, \u043a\u0443\u0434\u0430 \u0432\u044b \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 Rust.<\/p>\n<\/div>\n<p> \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\/post\/504020\/\"> https:\/\/habr.com\/ru\/post\/504020\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/504020\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bb\/of\/xl\/bbofxlb7l5mmqv_ejwfybdcogvs.png\"><\/p>\n<p>  <\/p>\n<h1 id=\"vvedenie\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/www.rust-lang.org\/\" rel=\"nofollow\">Rust<\/a> \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u0432 Rust, \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0438\u0432\u0448\u0438\u0445 \u043e\u043a\u0443\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u0443 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044e \u043d\u043e\u0440\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0441 \u0436\u0434\u0451\u0442 \u0446\u0435\u043b\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Rust, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inductive_reasoning\" rel=\"nofollow\">\u0438\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435<\/a> \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0442\u0438\u043f\u0430\u0445 \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Declarative_programming\" rel=\"nofollow\">\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c API \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0430\u043c \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>async\/.await<\/code>.<\/p>\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-304629","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304629","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=304629"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304629\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}