{"id":289900,"date":"2018-09-25T19:55:03","date_gmt":"2018-09-25T15:55:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=289900"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=289900","title":{"rendered":"\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432 \u043d\u0430\u0448\u0438 \u0434\u043d\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0412\u043a\u0440\u0430\u0442\u0446\u0435:<\/p>\n<p>  <\/p>\n<blockquote>\n<ul>\n<li>\u041f\u0440\u0443\u0444 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 <strong>C++<\/strong>, <strong>JS<\/strong> \u0438 <strong>PHP<\/strong>, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f <strong>Java<\/strong>.<\/li>\n<li><strong>\u0411\u044b\u0441\u0442\u0440\u0435\u0435<\/strong> \u0447\u0435\u043c coroutine \u0438 Promise, \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0438\u0447.<\/li>\n<li>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430.<\/li>\n<li>\u0414\u0440\u0443\u0436\u0438\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<hr>\n<p>  <\/p>\n<ul>\n<li><a href=\"#vzglyad-nazad\">\u0412\u0437\u0433\u043b\u044f\u0434 \u043d\u0430\u0437\u0430\u0434<\/a><\/li>\n<li><a href=\"#futoin-asyncsteps---alternativa-soprogrammam\">FutoIn AsyncSteps \u2014 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c<\/a><\/li>\n<li><a href=\"#k-cifram\">\u041a \u0446\u0438\u0444\u0440\u0430\u043c<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"vzglyad-nazad\">\u0412\u0437\u0433\u043b\u044f\u0434 \u043d\u0430\u0437\u0430\u0434<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u0437\u0430\u0440\u0435 \u042d\u0412\u041c \u0431\u044b\u043b \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434. \u041f\u043e\u0442\u043e\u043c \u043a \u043d\u0435\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0436\u0435\u043b\u0435\u0437\u0430. \u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0445 \u0438 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0440\u043e\u0441\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0436\u0435\u043b\u0435\u0437\u0430 \u0438 \u0435\u0433\u043e \u043c\u0430\u043b\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0447\u0442\u043e \u0441\u043d\u0430\u0431\u0434\u0438\u043b\u0438 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0442 \u0436\u0435\u043b\u0435\u0437\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u0441\u0442\u0430\u043b\u0430 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0435 \u0442\u0435\u0445 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043d\u043e \u0441 \u043e\u0431\u0449\u0438\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u041e\u0421.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0438 \u0434\u0430\u0436\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0431\u044b\u043b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f Promise\/Future \u0435\u0449\u0451 40+ \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u043c\u0435\u0448\u043d\u0430\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 10K \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u043b\u0438 \u043a \u043f\u0435\u0440\u0438\u043e\u0434\u0443 \u0440\u0430\u0441\u0446\u0432\u0435\u0442\u0430 Event Loop, Reactor \u0438 Proactor \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0447\u0435\u043c \u044f\u0441\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c coroutine (\u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0435\u0439 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u0432\u0441\u0451 \u043a \u0442\u043e\u0439 \u0436\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 Promise\/Future. \u041a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u043e\u0440\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0438\u043d\u0430\u0447\u0435 \u2014 &#171;Task&#187;.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435 \u0432\u0441\u0451 \u0441\u043f\u0440\u044f\u0442\u0430\u043b\u0438 \u0432 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443 <code>async\/await<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"problemy-s-tekuschiy-situaciy-asinhronnoy-biznes-logiki\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438<\/h3>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e coroutines \u0438 Promise, \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0435 <code>async\/await<\/code>, \u0442.\u043a. \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u0434\u0432\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430 \u043d\u0435 \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 ECMAScript \u043d\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0430 \u0435\u0441\u0442\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>Promise<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043b\u0438\u0448\u044c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0430\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 (callback hell). \u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0435 \u0434\u0432\u0438\u0436\u043a\u0438 \u0432\u0440\u043e\u0434\u0435 V8 \u0438\u0434\u0443\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0441\u043e\u0431\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\u0438\u0441\u0442\u044b\u0445 <code>async\/await<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432 \u043e \u043d\u0435 \u043f\u043e\u043f\u0430\u0432\u0448\u0438\u0445 \u0432 C++17 <code>co_async\/co_await<\/code> \u0435\u0441\u0442\u044c <a href=\"https:\/\/habr.com\/post\/278267\/\">\u0437\u0434\u0435\u0441\u044c \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u0435<\/a>, \u043d\u043e \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0444\u0442\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u0433\u0438\u0433\u0430\u043d\u0442\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0430\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0438\u0445 \u0432\u0438\u0434\u0435. \u041f\u043e\u043a\u0430 \u0436\u0435 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 <a href=\"https:\/\/www.boost.org\/doc\/libs\/1_68_0\/libs\/context\/doc\/html\/index.html\">Boost.Context<\/a>, <a href=\"https:\/\/www.boost.org\/doc\/libs\/1_68_0\/libs\/fiber\/doc\/html\/index.html\">Boost.Fiber<\/a> \u0438 <a href=\"https:\/\/www.boost.org\/doc\/libs\/1_68_0\/libs\/coroutine2\/doc\/html\/index.html\">Boost.Coroutine2<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 Java \u0442\u0430\u043a \u0436\u0435 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435\u0442 <code>async\/await<\/code> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u044f\u0437\u044b\u043a\u0430, \u043d\u043e \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u043a <a href=\"https:\/\/github.com\/electronicarts\/ea-async\">EA Async<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u043a \u0438 Boost.Context \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e JVM \u0438 \u0431\u0430\u0439\u0442 \u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 Go \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0432\u043e\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0431\u0430\u0433 \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0442\u043e \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0433\u043b\u0430\u0434\u043a\u043e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043e\u0442\u0435\u0440\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043b\u0443\u0447\u0448\u0430\u044f \u0438\u0434\u0435\u044f.<\/p>\n<p>  <\/p>\n<h4 id=\"mnenie-avtora-soprogrammy-na-golom-zheleze-opasny\">\u041c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430: \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0433\u043e\u043b\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u043e\u043f\u0430\u0441\u043d\u044b<\/h4>\n<p>  <\/p>\n<p>\u041b\u0438\u0447\u043d\u043e \u0430\u0432\u0442\u043e\u0440 \u043c\u0430\u043b\u043e \u0447\u0435\u0433\u043e \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u043d\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u0440\u043e\u0436\u0435\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043b\u044e\u0431\u044b\u043c \u0437\u0430\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0437\u0438\u0441\u043e\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0442\u0435\u043a:<br \/> \n<ul>\n<li>\u0441\u0442\u0435\u043a \u043d\u0430 \u043a\u0443\u0447\u0435 \u0438\u043c\u0435\u0435\u0442 \u0446\u0435\u043b\u044b\u0439 \u0440\u044f\u0434 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0435\u0434\u044f\u043c\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438\/\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438,<\/li>\n<li>\u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043e\u0434\u043d\u0443 \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>async<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438: 4+KB (\u043c\u0438\u043d\u0438\u043c\u0443\u043c) + \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043b\u0438\u043c\u0438\u0442\u044b,<\/li>\n<li>\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<\/ul>\n<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c:<br \/> \n<ul>\n<li>\u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u0434\u0430\u0436\u0435 \u043c\u043e\u0434\u0435\u043b\u0438) \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 (ABI): <a href=\"https:\/\/github.com\/boostorg\/context\/tree\/develop\/src\/asm\">\u043f\u0440\u0438\u043c\u0435\u0440<\/a>,<\/li>\n<li>\u043d\u043e\u0432\u044b\u0435 \u0438\u043b\u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0447\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0432\u043d\u043e\u0441\u044f\u0442 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Intel TSX, \u0441\u043e-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b ARM \u0438\u043b\u0438 MIPS),<\/li>\n<li>\u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u0437-\u0437\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c (\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Boost \u043d\u0430 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f).<\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0446\u0435\u043b\u043e\u043c:<br \/> \n<ul>\n<li>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Valgrind \u0432\u0441\u0451 \u0438\u0437-\u0437\u0430 \u0442\u0435\u0445 \u0436\u0435 \u0441\u043a\u0430\u0447\u0443\u0449\u0438\u0445 \u0441\u0442\u0435\u043a\u043e\u0432,<\/li>\n<li>\u0441\u043b\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0437\u0430 \u0430\u043d\u0442\u0438\u0432\u0438\u0440\u0443\u0441\u044b, \u043d\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043c \u044d\u0442\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 JVM \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c,<\/li>\n<li>\u0443\u0432\u0435\u0440\u0435\u043d, \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u0432\u0438\u0434\u044b \u0430\u0442\u0430\u043a \u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u043a\u0440\u044b\u0442\u044b \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<h4 id=\"mnenie-avtora-generatory-i-yield-principialnoe-zlo\">\u041c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430: \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 <code>yield<\/code> \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043b\u043e<\/h4>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0442\u0435\u043c\u0430 \u043f\u0440\u044f\u043c\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 &#171;\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f&#187;.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440. \u0414\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u2014 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0435\u0439\u0441 \u0441 <code>range()<\/code> \u0432 Python \u0441\u043a\u043e\u0440\u0435\u0435 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u043f\u0435\u043d\u0434\u0440\u0451\u0436, \u0447\u0435\u043c \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043a\u0435\u0439\u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0442\u043e \u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u0430. \u0414\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0438\u0445\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c\u044b\u0439 \u0446\u0438\u043a\u043b.<\/p>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043a\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u2014 \u044d\u0442\u043e \u0432\u0441\u044f\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u0441 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u0443\u0437\u043a\u0438\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u043d\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0435, \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u0438\u0432\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u044b. \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0444\u0430\u043a\u0442\u0443, \u0440\u0435\u0448\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0441\u043e\u0441\u0430\u043d\u0430 \u0438\u0437 \u043f\u0430\u043b\u044c\u0446\u0430 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0434\u043b\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438. \u041d\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0437\u0430\u043f\u0440\u0435\u0442\u0430 \u043d\u0430 <code>goto<\/code> \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<h4 id=\"mnenie-avtora-model-asyncawait-na-promise-iz-ecmascript-bolee-nadyozhna-no-trebuet-adaptacii\">\u041c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430: \u043c\u043e\u0434\u0435\u043b\u044c <code>async\/await<\/code> \u043d\u0430 Promise \u0438\u0437 ECMAScript \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0451\u0436\u043d\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438<\/h4>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c\u044b\u0445 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0432 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u0443\u0441\u043a\u0438 \u043a\u043e\u0434\u0430 \u0441\u043a\u0440\u044b\u0442\u043d\u043e \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0431\u043b\u043e\u043a\u0438, \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412 \u0421++ \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">struct SomeObject {     using Value = std::vector&lt;int&gt;;      Promise funcPromise() {         return Promise.resolved(value_);     }      void funcCallback(std::function&lt;void()&gt; &amp;&amp;cb, const Value&amp; val) {         somehow_call_later(cb);     }      Value value_; };  Promise example() {     SomeObject some_obj;      return some_obj.funcPromise()         .catch([](const std::exception &amp;e){             \/\/ ...         })         .then([&amp;](SomeObject::value &amp;&amp;val){             return Promise([&amp;](Resolve&amp;&amp; resolve, Reject&amp;&amp;){                 some_obj.funcCallback(resolve, val);             });         }); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, <code>some_obj<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 <code>example()<\/code> \u0438 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043e\u043a \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u0441\u043a\u0440\u044b\u0442\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u0432 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u0443\u0447\u0435 \u0432 \u0445\u043e\u0434\u0435 type erasure \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 <code>std::function<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u0441\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Promise<\/code> \u0437\u0430\u0447\u0430\u0442 \u043d\u0430 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 &#171;\u043e\u0431\u0435\u0449\u0430\u043d\u0438\u044f&#187; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u041d\u0415 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">Promise example() {     struct LocalContext {         SomeObject some_obj;     };     auto ctx = std::make_shared&lt;LocalContext&gt;();      return some_obj.funcPromise()         .catch([](const std::exception &amp;e){             \/\/ ...         })             .then([ctx](SomeObject::Value &amp;&amp;val){             struct LocalContext2 {                 LocalContext2(std::shared_ptr&lt;LocalContext&gt; &amp;&amp;ctx, SomeObject::Value &amp;&amp;val) :                     ctx(ctx), val(val)                 {}                  std::shared_ptr&lt;LocalContext&gt; ctx;                 SomeObject::Value val;             };             auto ctx2 = std::make_shared&lt;LocalContext2&gt;(                 std::move(ctx),                 std::forward&lt;SomeObject::Value&gt;(val)             );              return Promise([ctx2](Resolve&amp;&amp; resolve, Reject&amp;&amp;){                 ctx2-&gt;ctx-&gt;some_obj.funcCallback([ctx2, resolve](){ resolve(); }, val);             });         }); }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: <code>std::move<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>std::shared_ptr<\/code> \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u044f\u043c\u0431\u0434 \u0441\u0440\u0430\u0437\u0443 \u0438 \u0440\u043e\u0441\u0442\u0430 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/em><\/p>\n<p>  <\/p>\n<p>\u0421 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c <code>async\/await<\/code> \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 &#171;\u0443\u0436\u0430\u0441\u044b&#187; \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 \u0443\u0434\u043e\u0431\u043e\u0432\u0430\u0440\u0438\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">async void example() {     SomeObject some_obj;      try {         SomeObject::Value val = await some_obj.func();     } catch (const std::exception&amp; e) (         \/\/ ...     }      \/\/ Capture \"async context\"     return Promise([async](Resolve&amp;&amp; resolve, Reject&amp;&amp;){         some_obj.funcCallback([async](){ resolve(); }, val);     }); }<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"mnenie-avtora-planirovschik-soprogramm---eto-perebor\">\u041c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430: \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440<\/h4>\n<p>  <\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0440\u0438\u0442\u0438\u043a\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0438 &#171;\u043d\u0435\u0447\u0435\u0441\u0442\u043d\u043e\u0435&#187; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u044d\u0448\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435: \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u043e\u043c. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u0449\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0422\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0441 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0442\u0451\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 Event Loop \u0441 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 &#171;\u0436\u0435\u043b\u0435\u0437\u043d\u044b\u043c\u0438&#187; \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421. \u0412\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 \u0438(\u0438\u043b\u0438) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430 (Mutex, Throttle).<\/p>\n<p>  <\/p>\n<p>\u0410\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\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0440\u0435\u0437\u0438\u043d\u043e\u0432\u044b\u043c\u0438 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0435\u0445 \u0436\u0435 \u043c\u0435\u0440 \u0447\u0442\u043e \u0438 \u0441 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u2014 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u0430\u043c\u0438 \u0441\u0442\u0435\u043a\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Future\/Promise \u0443\u0436\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u043e\u0439 \u0436\u0435 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0435\u0441\u043b\u0438 Future \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0422\u0430\u043a\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438\u0431\u043e \u043d\u0435 \u0434\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043b\u0438\u0431\u043e \u0434\u0430\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0434\u0432\u043e\u044f\u043a\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u044d\u0448\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0434\u0440\u0430\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0447\u0442\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438\u0437-\u0437\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043a \u043e\u0431\u0449\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 Event Loop&#8217;\u0430 \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0442.\u043a. \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0435\u0437 \u0433\u043e\u043d\u043a\u0438 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<\/p>\n<p>  <\/p>\n<h4 id=\"mnenie-avtora-vsyo-horosho-v-meru\">\u041c\u043d\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0430: \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e \u0432 \u043c\u0435\u0440\u0443<\/h4>\n<p>  <\/p>\n<p>\u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u041e\u0421 \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u0422\u0430\u043a \u0436\u0435, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 Event Loop \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0445 &#171;\u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0445&#187; \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u044b\u0445 \u043d\u0443\u0436\u0434.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b Event Loop&#8217;\u043e\u0432 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445, \u0430 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432\u0441\u0451 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0451 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u043a \u043d\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2p\/pp\/lb\/2ppplbzrvm8c0yvbasdwrojknss.png\" width=\"326\" height=\"326\"><\/div>\n<p>  <\/p>\n<h2 id=\"futoin-asyncsteps---alternativa-soprogrammam\">FutoIn AsyncSteps \u2014 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c<\/h2>\n<p>  <\/p>\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0443\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0432\u0448\u0438\u0439 \u0441\u0435\u0431\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d Event Loop \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u0445\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0443 ECMAScript(JavaScript) Promise.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0442 Event Loop:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0435\u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Handle immediate(callack)<\/code> \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/li>\n<li>\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Handle deferred(delay, callback)<\/code>.<\/li>\n<li>\u041e\u0442\u043c\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>handle.cancel()<\/code>.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>AsyncTool<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u043a. \u041f\u0440\u044f\u043c\u043e\u0433\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u043d \u043d\u0435 \u0438\u043c\u0435\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"derevo-shagov\">\u0414\u0435\u0440\u0435\u0432\u043e \u0448\u0430\u0433\u043e\u0432:<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 AsyncSteps, \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u0428\u0430\u0433\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0451 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>AsyncSteps<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433. \u041f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>asi<\/code> \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e\u0435 <code>as<\/code>. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u0445 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445, \u043a\u0430\u0436\u0434\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e <code>AsyncSteps<\/code>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code>    asi.add( \/\/ Level 0 step 1         func( asi ){             print( \"Level 0 func\" )             asi.add( \/\/ Level 1 step 1                 func( asi ){                     print( \"Level 1 func\" )                     asi.error( \"MyError\" )                 },                 onerror( asi, error ){ \/\/ Level 1 step 1 catch                     print( \"Level 1 onerror: \" + error )                     asi.error( \"NewError\" )                 }             )         },         onerror( asi, error ){ \/\/ Level 0 step 1 catch             print( \"Level 0 onerror: \" + error )              if ( error strequal \"NewError\" ) {                 asi.success( \"Prm\", 123, [1, 2, 3], true)             }         }     )     asi.add( \/\/ Level 0 step 2         func( asi, str_param, int_param, array_param ){             print( \"Level 0 func2: \" + param )         }     )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code>    Level 0 func 1     Level 1 func 1     Level 1 onerror 1: MyError     Level 0 onerror 1: NewError     Level 0 func 2: Prm<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0431\u044b \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code>    str_res, int_res, array_res, bool_res \/\/ undefined      try {         \/\/ Level 0 step 1         print( \"Level 0 func 1\" )          try {             \/\/ Level 1 step 1             print( \"Level 1 func 1\" )             throw \"MyError\"         } catch( error ){             \/\/ Level 1 step 1 catch             print( \"Level 1 onerror 1: \" + error )             throw \"NewError\"         }     } catch( error ){         \/\/ Level 0 step 1 catch         print( \"Level 0 onerror 1: \" + error )          if ( error strequal \"NewError\" ) {             str_res = \"Prm\"             int_res = 123             array_res = [1, 2, 3]             bool_res = true         } else {             re-throw         }     }      {         \/\/ Level 0 step 2         print( \"Level 0 func 2: \" + str_res )     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0438\u043c\u0438\u043a\u0440\u0438\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u0435\u0442 <a href=\"https:\/\/specs.futoin.org\/final\/preview\/ftn12_async_api.html\">\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439<\/a>, \u043d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0435 \u0447\u0430\u0441\u0442\u0438. \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0438\u0436\u0435, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0431\u043a\u0430\u0442\u043a\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043b\u0435\u0442.<\/p>\n<p>  <\/p>\n<h3 id=\"bazovye-api-vremeni-vypolneniya\">\u0411\u0430\u0437\u043e\u0432\u044b\u0435 API \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>add(func[, onerror])<\/code> \u2014 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044f <code>try-catch<\/code>.<\/li>\n<li><code>success([args...])<\/code> \u2014 \u044f\u0432\u043d\u043e\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f:<br \/> \n<ul>\n<li>\u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e,<\/li>\n<li>\u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433.<\/li>\n<\/ul>\n<\/li>\n<li><code>error(code[, reason)<\/code> \u2014 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<br \/> \n<ul>\n<li><code>code<\/code> \u2014 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0439 \u0442\u0438\u043f \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435,<\/li>\n<li><code>reason<\/code> \u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430.<\/li>\n<\/ul>\n<\/li>\n<li><code>state()<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 Thread Local Storage. \u041f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438:<br \/> \n<ul>\n<li><code>error_info<\/code> \u2014 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430,<\/li>\n<li><code>last_exception<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f,<\/li>\n<li><code>async_stack<\/code> \u2014 \u0441\u0442\u0435\u043a \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f,<\/li>\n<li>\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u2014 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0436\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0421++ \u043a\u043e\u0434\u043e\u043c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;futoin\/iasyncsteps.hpp&gt;  using namespace futoin;  void some_api(IAsyncSteps&amp; asi) {     asi.add(         [](IAsyncSteps&amp; asi) {             std::cout &lt;&lt; \"Level 0 func 1\" &lt;&lt; std::endl;              asi.add(                 [](IAsyncSteps&amp; asi) {                     std::cout &lt;&lt; \"Level 1 func 1\" &lt;&lt; std::endl;                     asi.error(\"MyError\");                 },                 [](IAsyncSteps&amp; asi, ErrorCode code) {                     std::cout &lt;&lt; \"Level 1 onerror 1: \" &lt;&lt; code &lt;&lt; std::endl;                     asi.error(\"NewError\", \"Human-readable description\");                 }             );         },         [](IAsyncSteps&amp; asi, ErrorCode code) {             std::cout &lt;&lt; \"Level 0 onerror 1: \" &lt;&lt; code &lt;&lt; std::endl;              if (code == \"NewError\") {                 \/\/ Human-readable error info                 assert(asi.state().error_info ==                         \"Human-readable description\");                  \/\/ Last exception thrown is also available in state                 std::exception_ptr e = asi.state().last_exception;                  \/\/ NOTE: smart conversion of \"const char*\"                 asi.success(\"Prm\", 123, std::vector&lt;int&gt;({1, 2, 3}, true));             }         }     );     asi.add(         [](IAsyncSteps&amp; asi, const futoin::string&amp; str_res, int int_res, std::vector&lt;int&gt;&amp;&amp; arr_res) {             std::cout &lt;&lt; \"Level 0 func 2: \" &lt;&lt; str_res &lt;&lt; std::endl;         }     ); }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"api-dlya-sozdaniya-ciklov\">API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>loop( func, [, label] )<\/code> \u2014 \u0448\u0430\u0433 \u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u043c \u0442\u0435\u043b\u043e\u043c.<\/li>\n<li><code>forEach( map|list, func [, label] )<\/code> \u2014 \u0448\u0430\u0433-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.<\/li>\n<li><code>repeat( count, func [, label] )<\/code> \u2014 \u0448\u0430\u0433-\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437.<\/li>\n<li><code>break( [label] )<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430.<\/li>\n<li><code>continue( [label] )<\/code> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u0441 \u043d\u043e\u0432\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438.<\/li>\n<\/ol>\n<p>  <\/p>\n<p><em>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f <code>breakLoop<\/code>, <code>continueLoop<\/code> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430 \u0441 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 C++:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">    asi.loop([](IAsyncSteps&amp; asi) {         \/\/ infinite loop         asi.breakLoop();     });     asi.repeat(10, [](IAsyncSteps&amp; asi, size_t i) {         \/\/ range loop from i=0 till i=9 (inclusive)         asi.continueLoop();     });     asi.forEach(             std::vector&lt;int&gt;{1, 2, 3},             [](IAsyncSteps&amp; asi, size_t i, int v) {                 \/\/ Iteration of vector-like and list-like objects             });     asi.forEach(             std::list&lt;futoin::string&gt;{\"1\", \"2\", \"3\"},             [](IAsyncSteps&amp; asi, size_t i, const futoin::string&amp; v) {                 \/\/ Iteration of vector-like and list-like objects             });     asi.forEach(             std::map&lt;futoin::string, futoin::string&gt;(),             [](IAsyncSteps&amp; asi,                const futoin::string&amp; key,                const futoin::string&amp; v) {                 \/\/ Iteration of map-like objects             });      std::map&lt;std::string, futoin::string&gt; non_const_map;     asi.forEach(             non_const_map,             [](IAsyncSteps&amp; asi, const std::string&amp; key, futoin::string&amp; v) {                 \/\/ Iteration of map-like objects, note the value reference type             });<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"api-integracii-s-vneshnimi-sobytiyami\">API \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>setTimeout( timeout_ms )<\/code> \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 <code>Timeout<\/code> \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0435\u0441\u043b\u0438 \u0448\u0430\u0433 \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/li>\n<li><code>setCancel( handler )<\/code> \u2014 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0442\u043c\u0435\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u0439 \u043e\u0442\u043c\u0435\u043d\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0435\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438.<\/li>\n<li><code>waitExternal()<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<br \/> \n<ul>\n<li><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445 \u0441\u043e \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430.<\/em><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u044f\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>success()<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 C++:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">    asi.add([](IAsyncSteps&amp; asi) {         auto handle = schedule_external_callback([&amp;](bool err) {             if (err) {                 try {                     asi.error(\"ExternalError\");                 } catch (...) {                     \/\/ pass                 }             } else {                 asi.success();             }         });          asi.setCancel([=](IAsyncSteps&amp; asi) { external_cancel(handle); });     });     asi.add(             [](IAsyncSteps&amp; asi) {                 \/\/ Raises Timeout error after specified period                 asi.setTimeout(std::chrono::seconds{10});                  asi.loop([](IAsyncSteps&amp; asi) {                     \/\/ infinite loop                 });             },             [](IAsyncSteps&amp; asi, ErrorCode code) {                 if (code == futoin::errors::Timeout) {                     asi();                 }             });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 ECMAScript:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">asi.add( (asi) =&gt; {     asi.waitExternal(); \/\/ disable implicit success()      some_obj.read( (err, data) =&gt; {         if (!asi.state) {             \/\/ ignore as AsyncSteps execution got canceled         } else if (err) {             try {                 asi.error( 'IOError', err );             } catch (_) {                 \/\/ ignore error thrown as there are no                 \/\/ AsyncSteps frames on stack.             }         } else {             asi.success( data );         }     } ); } );<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"api-integracii-s-futurepromise\">API \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Future\/Promise:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>await(promise_future[, on_error])<\/code> \u2014 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 Future\/Promise \u043a\u0430\u043a \u0448\u0430\u0433.<\/li>\n<li><code>promise()<\/code> \u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 Future\/Promise, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u043e <code>execute()<\/code>.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 C++:<\/p>\n<p>  <\/p>\n<pre><code>    [](IAsyncSteps&amp; asi) {         \/\/ Proper way to create new AsyncSteps instances         \/\/ without hard dependency on implementation.         auto new_steps = asi.newInstance();         new_steps-&gt;add([](IAsyncSteps&amp; asi) {});          \/\/ Can be called outside of AsyncSteps event loop         \/\/ new_steps.promise().wait();         \/\/  or         \/\/ new_steps.promise&lt;int&gt;().get();          \/\/ Proper way to wait for standard std::future         asi.await(new_steps-&gt;promise());          \/\/ Ensure instance lifetime         asi.state()[\"some_obj\"] = std::move(new_steps);     };<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"api-kontrolya-potoka-vypolneniya-biznes-logiki\">API \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>AsyncSteps(AsyncTool&amp;)<\/code> \u2014 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 Event Loop.<\/li>\n<li><code>execute()<\/code> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/li>\n<li><code>cancel()<\/code> \u2014 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 C++:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">#include &lt;futoin\/ri\/asyncsteps.hpp&gt; #include &lt;futoin\/ri\/asynctool.hpp&gt;  void example() {     futoin::ri::AsyncTool at;     futoin::ri::AsyncSteps asi{at};      asi.loop([&amp;](futoin::IAsyncSteps &amp;asi){         \/\/ Some infinite loop logic     });      asi.execute();      std::this_thread::sleep_for(std::chrono::seconds{10});      asi.cancel(); \/\/ called in d-tor by fact }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"prochie-api\">\u043f\u0440\u043e\u0447\u0438\u0435 API:<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>newInstance()<\/code> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0440\u044f\u043c\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/li>\n<li><code>sync(object, func, onerror)<\/code> \u2014 \u0442\u043e \u0436\u0435, \u043d\u043e \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/li>\n<li><code>parallel([on_error])<\/code> \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <code>add()<\/code>, \u043f\u043e\u0434\u0448\u0430\u0433\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 AsyncSteps:<br \/> \n<ul>\n<li>\u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043e\u0431\u0449\u0438\u0439 <code>state()<\/code>,<\/li>\n<li>\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445,<\/li>\n<li>\u043d\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043b\u044e\u0431\u043e\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b C++:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">    #include &lt;futoin\/ri\/mutex.hpp&gt;      using namespace futoin;      ri::Mutex mtx_a;      void sync_example(IAsyncSteps&amp; asi) {         asi.sync(mtx_a, [](IAsyncSteps&amp; asi) {             \/\/ synchronized section             asi.add([](IAsyncSteps&amp; asi) {                 \/\/ inner step in the section                  \/\/ This synchronization is NOOP for already                 \/\/ acquired Mutex.                 asi.sync(mtx_a, [](IAsyncSteps&amp; asi) {                 });             });         });     }      void parallel_example(IAsyncSteps&amp; asi) {         using OrderVector = std::vector&lt;int&gt;;         asi.state(\"order\", OrderVector{});          auto&amp; p = asi.parallel([](IAsyncSteps&amp; asi, ErrorCode) {             \/\/ Overall error handler             asi.success();         });         p.add([](IAsyncSteps&amp; asi) {             \/\/ regular flow             asi.state&lt;OrderVector&gt;(\"order\").push_back(1);              asi.add([](IAsyncSteps&amp; asi) {                 asi.state&lt;OrderVector&gt;(\"order\").push_back(4);             });         });         p.add([](IAsyncSteps&amp; asi) {             asi.state&lt;OrderVector&gt;(\"order\").push_back(2);              asi.add([](IAsyncSteps&amp; asi) {                 asi.state&lt;OrderVector&gt;(\"order\").push_back(5);                 asi.error(\"SomeError\");             });         });         p.add([](IAsyncSteps&amp; asi) {             asi.state&lt;OrderVector&gt;(\"order\").push_back(3);              asi.add([](IAsyncSteps&amp; asi) {                 asi.state&lt;OrderVector&gt;(\"order\").push_back(6);             });         });          asi.add([](IAsyncSteps&amp; asi) {             asi.state&lt;OrderVector&gt;(\"order\"); \/\/ 1, 2, 3, 4, 5         });     };<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"standartnye-primitivy-dlya-sinhronizacii\">\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<ol>\n<li><code>Mutex<\/code> \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 <code>N<\/code> \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0432 <code>Q<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>N=1, Q=unlimited<\/code>.<\/li>\n<li><code>Throttle<\/code> \u2014 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0434\u043e\u0432 <code>N<\/code> \u0432 \u043f\u0435\u0440\u0438\u043e\u0434 <code>P<\/code> \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0432 <code>Q<\/code>, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>N=1, P=1s, Q=0<\/code>.<\/li>\n<li><code>Limiter<\/code> \u2014 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f <code>Mutex<\/code> \u0438 <code>Throttle<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0441 \u0446\u0435\u043b\u044c\u044e \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0437\u0430 \u043b\u0438\u043c\u0438\u0442\u044b \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 <code>DefenseRejected<\/code>, \u0441\u043c\u044b\u0441\u043b \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0441\u0435\u043d \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f <code>Limiter<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"klyuchevye-preimuschestva\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f AsyncSteps \u043d\u0435 \u0431\u044b\u043b\u0430 \u0441\u0430\u043c\u043e\u0446\u0435\u043b\u044c\u044e, \u0430 \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043b\u0438\u043c\u0438\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041d\u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443:<\/p>\n<p>  <\/p>\n<p><strong>\u0415\u0434\u0438\u043d\u0430\u044f <a href=\"https:\/\/specs.futoin.org\/final\/preview\/ftn12_async_api.html\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f FTN12<\/a> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439<\/strong> \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e.<\/p>\n<p>  <\/p>\n<p><strong>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043c\u0435\u043d\u044b <code>setCancel()<\/code><\/strong> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u0434\u0447\u0438\u0449\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u044f\u0441\u043d\u044b\u043c \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043e\u0442\u043c\u0435\u043d\u0435 \u0438\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0436\u0435 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 RAII \u0438 <code>atexit()<\/code> \u0432 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>cancel()<\/code><\/strong> \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0440\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 <code>SIGTERM<\/code> \u0438\u043b\u0438 <code>pthread_cancel()<\/code>, \u043e\u0431\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u0422\u0430\u0439\u043c\u0435\u0440\u044b \u043e\u0442\u043c\u0435\u043d\u044b \u0448\u0430\u0433\u0430 <code>setTimeout()<\/code><\/strong> \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0414\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430 \u0432\u0441\u0451 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e, \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 &#171;Timeout&#187;.<\/p>\n<p>  <\/p>\n<p><strong>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438 \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<\/strong> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 FutoIn AsyncSteps \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<p>  <\/p>\n<p><strong>\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong> \u2014 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0445 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 ABI \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f Embedded \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043d\u0430 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 MMU.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yj\/8x\/wv\/yj8xwvibm7tjsj30qhojwbleige.jpeg\"><\/div>\n<p>  <\/p>\n<p><a href=\"https:\/\/unsplash.com\/@chuttersnap?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge\"><em>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/em><\/a><\/p>\n<p>  <\/p>\n<h2 id=\"k-cifram\">\u041a \u0446\u0438\u0444\u0440\u0430\u043c<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Intel Xeon E3-1245v2\/DDR1333 \u0441 Debian Stretch \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u044f\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<ol>\n<li>Boost.Fiber \u0441 <code>protected_fixedsize_stack<\/code>.<\/li>\n<li>Boost.Fiber \u0441 <code>pooled_fixedsize_stack<\/code> \u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u043e\u0431\u0449\u0435\u0439 \u043a\u0443\u0447\u0435.<\/li>\n<li>FutoIn AsyncSteps \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438.<\/li>\n<li>FutoIn AsyncSteps \u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043f\u0443\u043b\u043e\u043c \u043f\u0430\u043c\u044f\u0442\u0438 (<code>FUTOIN_USE_MEMPOOL=false<\/code>).<br \/> \n<ul>\n<li>\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 <code>futoin::IMemPool<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li>FutoIn NitroSteps&lt;&gt; \u2014 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<br \/> \n<ul>\n<li>\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u0432\u0438\u0434\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 Boost.Fiber \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 1 \u043c\u043b\u043d. \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/li>\n<li>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441 \u043b\u0438\u043c\u0438\u0442\u043e\u043c \u0432 30 \u0442\u044b\u0441. \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 1 \u043c\u043b\u043d. \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/> \n<ul>\n<li>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 30 \u0442\u044b\u0441. \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>mmap()\/mprotect()<\/code> \u0434\u043b\u044f <code>boost::fiber::protected_fixedsize_stack<\/code>.<\/li>\n<li>\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0434\u043b\u044f \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u044d\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/li>\n<\/ul>\n<\/li>\n<li>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 30 \u0442\u044b\u0441. \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 10 \u043c\u043b\u043d. \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<br \/> \n<ul>\n<li>\u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 &#171;\u0432\u043d\u0435\u0448\u043d\u0435\u0435&#187; \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u043e\u0439 \u0436\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u044f\u0434\u0440\u043e \u0438 \u043e\u0434\u0438\u043d &#171;\u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439&#187; \u043f\u043e\u0442\u043e\u043a, \u0442.\u043a. \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0433\u043e\u043d\u043a\u0438 \u043d\u0430 \u0441\u043f\u0438\u043d\u043b\u043e\u043a\u0430\u0445 \u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445. \u041d\u0430\u0438\u043b\u0443\u0447\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0434\u0443\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0441 GCC 6.3.0. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441 \u0421lang \u0438 tcmalloc \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438\u0441\u044c, \u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/futoin\/core-cpp-ri-asyncsteps\/tree\/v1.3.0\/bench\">GitHub<\/a> \u0438 <a href=\"https:\/\/gitlab.com\/futoin\/core\/cpp\/ri-asyncsteps\/tree\/v1.3.0\/bench\">GitLab<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"1-posledovatelnoe-sozdanie\">1. \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<table>\n<thead>\n<tr>\n<th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f<\/th>\n<th>\u0413\u0446<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Boost.Fiber protected<\/td>\n<td>4.8s<\/td>\n<td>208333.333Hz<\/td>\n<\/tr>\n<tr>\n<td>Boost.Fiber pooled<\/td>\n<td>0.23s<\/td>\n<td>4347826.086Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td><strong>0.21s<\/strong><\/td>\n<td><strong>4761904.761Hz<\/strong><\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps no mempool<\/td>\n<td>0.31s<\/td>\n<td>3225806.451Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn NitroSteps<\/td>\n<td>0.255s<\/td>\n<td>3921568.627Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qm\/ur\/y6\/qmury65-mbkth_om8smkfi7vamq.png\"><\/div>\n<p>  <\/p>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435.<\/em><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u043e\u0442\u0435\u0440\u044f \u0443 Boost.Fiber \u0438\u0437-\u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u0434\u0430\u0436\u0435 \u043c\u0435\u043d\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 <code>pooled_fixedsize_stack<\/code> \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f AsyncSteps.<\/p>\n<p>  <\/p>\n<h3 id=\"2-parallelnoe-sozdanie-i-ispolnenie\">2. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<table>\n<thead>\n<tr>\n<th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f<\/th>\n<th>\u0413\u0446<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Boost.Fiber protected<\/td>\n<td>6.31s<\/td>\n<td>158478.605Hz<\/td>\n<\/tr>\n<tr>\n<td>Boost.Fiber pooled<\/td>\n<td>1.558s<\/td>\n<td>641848.523Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td><strong>1.13s<\/strong><\/td>\n<td><strong>884955.752Hz<\/strong><\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps no mempool<\/td>\n<td>1.353s<\/td>\n<td>739098.300Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn NitroSteps<\/td>\n<td>1.43s<\/td>\n<td>699300.699Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0s\/gz\/lu\/0sgzlur2xsrlf-wo4mrcynvzhxi.png\"><\/div>\n<p>  <\/p>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435.<\/em><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043d\u043e \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c. \u041d\u0443\u0436\u0435\u043d \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u043d\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u0433\u0430\u0434\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u044e\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043d\u044b\u0445 \u0438\u0437\u043b\u043e\u043c\u043e\u0432.<\/p>\n<p>  <\/p>\n<h3 id=\"3-parallelnye-cikly\">3. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b<\/h3>\n<p>  <\/p>\n<table>\n<thead>\n<tr>\n<th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f<\/th>\n<th>\u0413\u0446<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Boost.Fiber protected<\/td>\n<td>5.096s<\/td>\n<td>1962323.390Hz<\/td>\n<\/tr>\n<tr>\n<td>Boost.Fiber pooled<\/td>\n<td>5.077s<\/td>\n<td>1969667.126Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td>5.361s<\/td>\n<td>1865323.633Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps no mempool<\/td>\n<td>8.288s<\/td>\n<td>1206563.706Hz<\/td>\n<\/tr>\n<tr>\n<td>FutoIn NitroSteps<\/td>\n<td><strong>3.68s<\/strong><\/td>\n<td><strong>2717391.304Hz<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pb\/c1\/17\/pbc117djqds0d4twh5fzcklsmfc.png\"><\/div>\n<p>  <\/p>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435.<\/em><\/p>\n<p>  <\/p>\n<p>\u0423\u0431\u0438\u0440\u0430\u044f \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0432 \u0433\u043e\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Boost.Fiber \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 AsyncSteps, \u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 NitroSteps.<\/p>\n<p>  <\/p>\n<h3 id=\"ispolzovanie-pamyati-po-rss\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043f\u043e RSS)<\/h3>\n<p>  <\/p>\n<table>\n<thead>\n<tr>\n<th>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th>\n<th>\u041f\u0430\u043c\u044f\u0442\u044c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Boost.Fiber protected<\/td>\n<td>124M<\/td>\n<\/tr>\n<tr>\n<td>Boost.Fiber pooled<\/td>\n<td>505M<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td>124M<\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps no mempool<\/td>\n<td><strong>84M<\/strong><\/td>\n<\/tr>\n<tr>\n<td>FutoIn NitroSteps<\/td>\n<td>115M<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ol\/w0\/6n\/olw06nef5wj3ah1lo9u-pby9sfg.png\"><\/div>\n<p>  <\/p>\n<p><em>\u041c\u0435\u043d\u044c\u0448\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435.<\/em><\/p>\n<p>  <\/p>\n<p>\u0418 \u0441\u043d\u043e\u0432\u0430, Boost.Fiber \u043d\u0435\u0447\u0435\u043c \u0433\u043e\u0440\u0434\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<h3 id=\"bonus-testy-na-nodejs\">\u0411\u043e\u043d\u0443\u0441: \u0442\u0435\u0441\u0442\u044b \u043d\u0430 Node.js<\/h3>\n<p>  <\/p>\n<p>\u0412\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u0442\u0435\u0441\u0442\u0430 \u0442\u0430\u043a \u0436\u0435 \u0438\u0437-\u0437\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 <code>Promise<\/code>: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435+\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u0446\u0438\u043a\u043b\u044b \u043f\u043e 10 \u0442\u044b\u0441. \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442 10 \u0441\u0435\u043a\u0443\u043d\u0434. \u0411\u0435\u0440\u0443\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0413\u0446 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e JIT \u043f\u0440\u0438 <code>NODE_ENV=production<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/www.npmjs.com\/package\/@futoin\/optihelp\"><code>@futoin\/optihelp<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/futoin\/core-js-ri-asyncsteps\/blob\/v2.3.2\/test\/opticompare.js\">GitHub<\/a> \u0438 <a href=\"https:\/\/gitlab.com\/futoin\/core\/js\/ri-asyncsteps\/blob\/v2.3.2\/test\/opticompare.js\">GitLab<\/a>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u0438 Node.js v8.12.0 \u0438 v10.11.0, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/futoin.org\/docs\/cid\/\">FutoIn CID<\/a>.<\/p>\n<p>  <\/p>\n<table>\n<thead>\n<tr>\n<th>Tech<\/th>\n<th>Simple<\/th>\n<th>Loop<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Node.js v10<\/strong><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td><strong>1342899.520Hz<\/strong><\/td>\n<td>587.777Hz<\/td>\n<\/tr>\n<tr>\n<td>async\/await<\/td>\n<td>524983.234Hz<\/td>\n<td><strong>630.863Hz<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Node.js v8<\/strong><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>FutoIn AsyncSteps<\/td>\n<td><strong>682420.735Hz<\/strong><\/td>\n<td><strong>588.336Hz<\/strong><\/td>\n<\/tr>\n<tr>\n<td>async\/await<\/td>\n<td>365050.395Hz<\/td>\n<td>400.575Hz<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/x7\/-n\/b5\/x7-nb5v9dfkwn1lttyg67w2b_tk.png\"><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gh\/yj\/9p\/ghyj9pczw0smbfksq-aad_tltay.png\"><\/div>\n<p>  <\/p>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u0435 \u2014 \u043b\u0443\u0447\u0448\u0435.<\/em><\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u0439 \u0440\u0430\u0437\u0433\u0440\u043e\u043c <code>async\/await<\/code>? \u0414\u0430, \u043d\u043e \u0432 V8 \u0434\u043b\u044f Node.js v10 \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 \u0441\u0442\u0430\u043b\u043e \u0447\u0443\u0442\u044c \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Promise \u0438 <code>async\/await<\/code> <strong>\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442<\/strong> Node.js Event Loop. \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0431\u0435\u0437 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043f\u043e\u0432\u0435\u0441\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 (<a href=\"https:\/\/gist.github.com\/andvgal\/14e745405c3cb7d14bd91ab0530ce8ca\">\u043f\u0440\u0443\u0444<\/a>), \u043d\u043e \u0441 FutoIn AsyncSteps \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p><em>\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 AsyncSteps \u0432 Node.js Event Loop \u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043b\u043e\u0436\u043d\u043e\u0439 \u043f\u043e\u0431\u0435\u0434\u044b <code>async\/await<\/code> \u0432 \u0442\u0435\u0441\u0442\u0435-\u0446\u0438\u043a\u043b\u0435 \u043d\u0430 Node.js v10.<\/em><\/p>\n<p>  <\/p>\n<p><em>\u041e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u0421++ \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u2014 \u0440\u0430\u0437\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u043e\u0432 Node.js \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 10 \u0442\u044b\u0441.<\/em><\/p>\n<p>  <\/p>\n<h3 id=\"vyvody\">\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 C++, FutoIn AsyncSteps \u0438 Boost.Fiber \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0445\u043e\u0436\u0443\u044e \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0432\u043e\u0442 \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 Boost.Fiber \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u043b\u0438\u043c\u0438\u0442\u0430\u043c\u0438 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 <code>mmap()\/mprotect<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u044d\u0448\u0430, \u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u044d\u0448, \u0447\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0412\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>FutoIn AsyncSteps \u0434\u043b\u044f JavaScript \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 <code>async\/await<\/code> \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u0436\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Node.js v10.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0441\u0447\u0451\u0442\u0435, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438, \u0430 \u043d\u0435 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \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. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u0432\u0438\u0434\u0435 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0451\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a \u0438 \u043d\u0430 \u0434\u043e\u043b\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 &#171;\u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439&#187; \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 API.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 FutoIn AsyncSteps \u043f\u0440\u043e\u0449\u0435, \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0435\u043d \u0447\u0435\u043c \u043b\u044e\u0431\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u0431\u0435\u0437 &#171;\u0441\u0430\u0445\u0430\u0440\u0430&#187; <code>async\/await<\/code>. \u0412\u0434\u043e\u0431\u0430\u0432\u043e\u043a, \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0438 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>Promise<\/code> \u0438\u0437 ECMAScript, AsyncSteps \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0439 &#171;\u0441\u0430\u0445\u0430\u0440&#187; \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445 \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u044b\u0435 \u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439. \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 AsyncSteps \u0438 NitroSteps \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0443\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 <a href=\"https:\/\/specs.futoin.org\/final\/preview\/ftn12_async_api.html\">\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/a>, \u0435\u0441\u0442\u044c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430-\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <a href=\"https:\/\/futoin.org\/docs\/asyncsteps\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f Java\/JVM \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0441 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u043c\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u2014 \u0438\u043d\u0430\u0447\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043f\u0430\u0434\u0430\u0435\u0442. \u041b\u044e\u0431\u0430\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430, \u0442\u043e \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0432\u0451\u0437\u0434\u043e\u0447\u043a\u0438 \u043d\u0430 <a href=\"https:\/\/github.com\/futoin?q=core-cpp\">GitHub<\/a> \u0438\/\u0438\u043b\u0438 <a href=\"https:\/\/gitlab.com\/futoin\/core\/cpp\">GitLab<\/a>.<\/p>\n<\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/424311\/\"> https:\/\/habr.com\/post\/424311\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u0412\u043a\u0440\u0430\u0442\u0446\u0435:<\/p>\n<p>  <\/p>\n<blockquote>\n<ul>\n<li>\u041f\u0440\u0443\u0444 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 <strong>C++<\/strong>, <strong>JS<\/strong> \u0438 <strong>PHP<\/strong>, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f <strong>Java<\/strong>.<\/li>\n<li><strong>\u0411\u044b\u0441\u0442\u0440\u0435\u0435<\/strong> \u0447\u0435\u043c coroutine \u0438 Promise, \u0431\u043e\u043b\u044c\u0448\u0435 \u0444\u0438\u0447.<\/li>\n<li>\u041d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430.<\/li>\n<li>\u0414\u0440\u0443\u0436\u0438\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\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-289900","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/289900","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=289900"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/289900\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=289900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=289900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=289900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}