{"id":484437,"date":"2026-06-21T17:01:53","date_gmt":"2026-06-21T17:01:53","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=484437"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=484437","title":{"rendered":"\u041a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 .await: \u043f\u0438\u0448\u0435\u043c \u0441\u0432\u043e\u0439 async-\u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043d\u0430 Rust \u0441 \u043d\u0443\u043b\u044f"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e Rust-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>.await<\/code>, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e \u00ab\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\u00bb. \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0434\u0443\u043c\u0430\u0435\u0442\u00bb \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430 <code>.await<\/code> \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>enum<\/code> \u0438 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p>\u042f \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043f\u0438\u0441\u0430\u043b async-\u043a\u043e\u0434 \u043d\u0430 tokio, \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0447\u0435\u0440\u043d\u043c \u044f\u0449\u0438\u043a\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u043b\u0435\u0437\u0442\u044c. \u0421\u043b\u043e\u043c\u0430\u043b\u0441\u044f \u044d\u0442\u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439 \u0432 \u0442\u043e\u0442 \u0434\u0435\u043d\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u043b\u0430 \u043e\u0434\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043b\u0430\u0441\u044c. \u042f \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u043d\u0430 \u043d\u0435\u0439 \u0432\u0435\u0447\u0435\u0440, \u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0440\u043e <code>Waker<\/code>, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0435\u0449\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f. \u0422\u043e\u0433\u0434\u0430 \u044f \u043f\u043b\u044e\u043d\u0443\u043b \u0438 \u0437\u0430 \u043f\u0430\u0440\u0443 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0441 \u043d\u0443\u043b\u044f &#8212; \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0441\u0435\u0441\u0442 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 200 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438 \u0442\u043e\u0442 \u0431\u0430\u0433 \u0441\u0442\u0430\u043b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 tokio \u043d\u0430\u0447\u0430\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a\u043d\u0438\u0433\u0430, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0437\u0430\u043a\u043b\u0438\u043d\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 async-\u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0439 <code>std<\/code>, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0411\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043f\u043e\u043b\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0440\u0443\u0442\u0438\u0442 \u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u0434\u0430\u0447 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0438 async-\u044d\u0445\u043e-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 <code>epoll<\/code>, \u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043e\u0442\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0442\u0435\u043c \u0436\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u041f\u043e \u0434\u043e\u0440\u043e\u0433\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445 \u0431\u0435\u0440\u0443\u0442\u0441\u044f <code>Pin<\/code>, <code>Send<\/code> \u0438 <code>'static<\/code>, \u043f\u043e\u0447\u0435\u043c\u0443 <code>Waker<\/code> \u0441\u0434\u0435\u043b\u0430\u043d \u0442\u0430\u043a \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0438 \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e tokio \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0443\u0448\u043a\u0438.<\/p>\n<p><strong>TL;DR.<\/strong> <code>async fn<\/code> \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (<code>enum<\/code>). \u0420\u0430\u043d\u0442\u0430\u0439\u043c \u044d\u0442\u043e \u0442\u0440\u0438 \u043a\u0443\u0431\u0438\u043a\u0430: <code>Future<\/code> \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0433 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u00ab\u0433\u043e\u0442\u043e\u0432\u043e\u00bb \u0438\u043b\u0438 \u00ab\u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441\u00bb; \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0438\u0445; \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0441\u043f\u0438\u0442 \u043d\u0430 <code>epoll_wait<\/code> \u0438 \u0431\u0443\u0434\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0433\u0434\u0430 \u041e\u0421 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043a\u0435\u0442\u0430. \u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 <code>Waker<\/code> &#8212; \u043a\u043e\u043b\u0431\u044d\u043a \u00ab\u0432\u0435\u0440\u043d\u0438 \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u00bb. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e busy-wait: \u0441\u043f\u044f\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u043e\u043b\u044c.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0436\u0435 \u043f\u0438\u0448\u0435\u0442 \u043d\u0430 Rust \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>async<\/code>\/<code>.await<\/code>, \u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f tokio \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043a \u043a\u043e\u043d\u0446\u0443 \u043e\u043d \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0451\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d \u0440\u0430\u043d\u0442\u0430\u0439\u043c<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u00ab\u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430. \u0421\u0442\u0435\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e 8 \u041c\u0411 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a \u0432 Linux; \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u043e \u043c\u0430\u043b\u043e, \u043d\u0430 100 \u0442\u044b\u0441\u044f\u0447\u0430\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u044b \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0432 \u043b\u0438\u043c\u0438\u0442\u044b, \u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u044f\u0434\u0440\u0430 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. Async \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u0438 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u0434\u0430\u0447, \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u044d\u0442\u043e \u043d\u0435 syscall, \u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0426\u0438\u0444\u0440\u044b, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0451 \u0437\u0430\u0442\u0435\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0443\u0441\u0442\u0430\u044f async-\u0437\u0430\u0434\u0430\u0447\u0430 \u0432 tokio \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 \u043f\u043b\u044e\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u0435\u0451 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u043e\u0442\u043d\u044f\u0445 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0430 \u043d\u0435 \u0432 \u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u0430\u0445 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a\u0438. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u044f\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u043d\u0443\u043b\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0451 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435.<\/p>\n<p>\u0413\u0440\u0443\u0431\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 100 000 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u00ab\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0436\u0434\u0443\u0449\u0438\u0445\u00bb \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u0442\u043e\u043a \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443<\/p>\n<\/th>\n<th>\n<p align=\"left\">Async-\u0437\u0430\u0434\u0430\u0447\u0430<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\">~8 \u041c\u0411 \u0432\u0438\u0440\u0442. \u0441\u0442\u0435\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">~\u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 + \u0440\u0430\u0437\u043c\u0435\u0440 future<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">100k \u0435\u0434\u0438\u043d\u0438\u0446<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u043c\u0438\u0442\u044b \u041e\u0421<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u041c\u0411<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">syscall, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u044f\u0434\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0442\u043e \u0431\u0443\u0434\u0438\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u044f\u0434\u0440\u043e \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443\/\u0441\u0438\u0433\u043d\u0430\u043b\u0443<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Waker<\/code> \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e <code>epoll<\/code><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0426\u0438\u0444\u0440\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b, \u0430 \u0432 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e:<\/p>\n<ul>\n<li>\n<p><code>Future<\/code> &#8212; \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c (<code>poll<\/code>) \u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u00ab\u0433\u043e\u0442\u043e\u0432\u043e, \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u00bb \u043b\u0438\u0431\u043e \u00ab\u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u0440\u0430\u0437\u0431\u0443\u0436\u0443 \u043f\u043e\u0437\u0436\u0435\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c (executor) &#8212; \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043a\u0442\u043e\u0440 (reactor) &#8212; \u043c\u043e\u0441\u0442 \u043a \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 <code>epoll<\/code>\/<code>kqueue<\/code>\/IOCP \u0436\u0434\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 \u0438 \u0431\u0443\u0434\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>async fn \u044d\u0442\u043e enum: \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0436\u0438\u0432\u0443\u0447\u0435\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e async \u0432 Rust &#8212; \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c \u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0442\u0435\u043a\u0430\u043c\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"rust\">async fn handle(mut sock: TcpStream) -&gt; usize {    let mut buf = [0u8; 1024];    let n = sock.read(&amp;mut buf).await;   \/\/ \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u21161    process(&amp;buf[..n]);    n}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435. \u041e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043f-\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 <code>.await<\/code> \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0432\u0441\u0451, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"rust\">enum HandleFuture {    Start { sock: TcpStream },    AwaitingRead { sock: TcpStream, buf: [u8; 1024], read: ReadFuture },    Done,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>poll<\/code> \u044d\u0442\u043e <code>match<\/code> \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0433, \u043f\u0440\u0438 <code>.await<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u043b\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>Pending<\/code>, \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443. \u0420\u0430\u0437\u043c\u0435\u0440 future \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0443\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u00ab\u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e\u00bb \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u0430\u044f \u0431\u043e\u043b\u044c \u0441 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c\u0438 \u0444\u0443\u0442\u0443\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <code>clippy<\/code> \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u0442 \u0431\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f: \u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 <code>-Z print-type-sizes<\/code>, \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0430\u0448\u0435\u0439 \u0444\u0443\u0442\u0443\u0440\u044b \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 rustc \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043d\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f:<\/p>\n<pre><code>print-type-size type: `HandleFuture`: 1040 bytes, alignment: 8 bytesprint-type-size     variant `AwaitingRead`: 1040 bytesprint-type-size         field `.buf`: 1024 bytesprint-type-size         field `.sock`: 8 bytesprint-type-size         field `.read`: 8 bytesprint-type-size     variant `Start`: 8 bytesprint-type-size     variant `Done`: 0 bytes<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0432\u0435\u0441 \u0444\u0443\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430\u0448 <code>buf<\/code> \u043d\u0430 1024 \u0431\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c <code>.await<\/code>, \u043f\u043b\u044e\u0441 \u043c\u0435\u043b\u043e\u0447\u044c \u043f\u043e\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0432 future. \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 <code>.await<\/code>, \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0435\u0451 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0418\u0437 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 <code>Pin<\/code>. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>AwaitingRead<\/code> \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 <code>read<\/code> \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>buf<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u0438\u043f: \u0441\u0434\u0432\u0438\u043d\u0435\u0442\u0435 \u0435\u0433\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 &#8212; \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0441\u044f\u0447\u0435\u0439. <code>Pin<\/code> \u044d\u0442\u043e \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u00ab\u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0434\u0435\u0442\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>poll<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>Pin&lt;&amp;mut Self&gt;<\/code>, \u0430 \u043d\u0435 <code>&amp;mut Self<\/code>. \u041d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0430\u043c\u043e\u0441\u0441\u044b\u043b\u043e\u043a &#8212; \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0438 <code>Pin<\/code>.<\/p>\n<h3>\u041a\u0443\u0431\u0438\u043a 1: Future \u0438 \u0435\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/h3>\n<p>\u0412\u0435\u0441\u044c \u0442\u0440\u0435\u0439\u0442:<\/p>\n<pre><code class=\"rust\">pub trait Future {    type Output;    fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context&lt;'_&gt;) -&gt; Poll&lt;Self::Output&gt;;}pub enum Poll&lt;T&gt; { Ready(T), Pending }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u0438 \u0432\u0430\u0436\u043d\u044b\u0439: \u0435\u0441\u043b\u0438 <code>poll<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>Pending<\/code>, future \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>Waker<\/code> \u0438\u0437 <code>cx<\/code> \u0438 \u043f\u043e\u0437\u0436\u0435 \u0434\u0451\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0448\u0430\u043d\u0441 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f. \u041d\u0430\u0440\u0443\u0448\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 &#8212; \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u043f\u0440\u043e\u0441\u0438\u0442, \u0438 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u042d\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0434\u043e\u0431\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u00ab\u043f\u043e\u0434\u0432\u0438\u0441\u0448\u0438\u0445\u00bb async-\u0431\u0430\u0433\u043e\u0432 \u0432 \u0440\u0443\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435.<\/p>\n<h3>\u041a\u0443\u0431\u0438\u043a 2: Waker, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/h3>\n<p><code>Waker<\/code> \u044d\u0442\u043e \u043a\u043e\u043b\u0431\u044d\u043a \u00ab\u043f\u043e\u043b\u043e\u0436\u0438 \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f\u00bb. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0442\u0443\u0442 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0431\u044b <code>Box&lt;dyn Fn()&gt;<\/code>. \u041d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 <code>Waker<\/code> \u0440\u0443\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 trait-\u043e\u0431\u044a\u0435\u043a\u0442: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u044e\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"rust\">pub struct RawWaker {    data: *const (),    vtable: &amp;'static RawWakerVTable,}pub struct RawWakerVTable {    clone: unsafe fn(*const ()) -&gt; RawWaker,    wake: unsafe fn(*const ()),    wake_by_ref: unsafe fn(*const ()),    drop: unsafe fn(*const ()),}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e? \u0417\u0430\u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f <code>Waker<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u044b: \u043d\u0430\u0448 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c, \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 tokio \u0441 work stealing, <code>block_on<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0430\u0440\u043a\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u044e vtable \u0438 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043a\u043e\u0434 future \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c: \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043e\u0432\u0451\u0442 <code>waker.wake()<\/code> \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442. \u042d\u0442\u043e \u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c &#8212; \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u044f\u0447\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c.<\/p>\n<p>\u041d\u0430\u0448 <code>Waker<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u0430\u043d\u0430\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f. \u0414\u0451\u0440\u043d\u0443\u043b\u0438 <code>wake<\/code> &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0435\u0442\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<pre><code class=\"rust\">fn make_waker(task_id: usize, queue: Sender&lt;usize&gt;) -&gt; Waker {    let data = Arc::new((task_id, queue));    unsafe fn clone(ptr: *const ()) -&gt; RawWaker {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        let cloned = arc.clone();        std::mem::forget(arc);        RawWaker::new(Arc::into_raw(cloned) as *const (), &amp;VTABLE)    }    unsafe fn wake(ptr: *const ()) {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        arc.1.send(arc.0).ok();    }    unsafe fn wake_by_ref(ptr: *const ()) {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        arc.1.send(arc.0).ok();        std::mem::forget(arc);    }    unsafe fn drop_fn(ptr: *const ()) {        drop(Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _));    }    static VTABLE: RawWakerVTable =        RawWakerVTable::new(clone, wake, wake_by_ref, drop_fn);    let raw = RawWaker::new(Arc::into_raw(data) as *const (), &amp;VTABLE);    unsafe { Waker::from_raw(raw) }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043d\u0438 \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a <code>Arc<\/code> \u0438 <code>unsafe<\/code> &#8212; \u044d\u0442\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u041b\u043e\u0433\u0438\u043a\u0430 \u0436\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430: \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u043b\u0438 &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 id \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u0434\u0438\u043d \u0440\u0430\u0437, \u0440\u043e\u0432\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e.<\/p>\n<h3>\u041a\u0443\u0431\u0438\u043a 3: \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0432 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0441\u0442\u0440\u043e\u043a<\/h3>\n<p>\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u0440\u0443\u0442\u0438\u0442 \u0446\u0438\u043a\u043b. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438.<\/p>\n<pre><code class=\"rust\">type BoxFuture = Pin&lt;Box&lt;dyn Future&lt;Output = ()&gt;&gt;&gt;;struct Executor {    tasks: HashMap&lt;usize, BoxFuture&gt;,    ready_rx: Receiver&lt;usize&gt;,    ready_tx: Sender&lt;usize&gt;,    next_id: usize,}impl Executor {    fn spawn(&amp;mut self, fut: impl Future&lt;Output = ()&gt; + 'static) {        let id = self.next_id;        self.next_id += 1;        self.tasks.insert(id, Box::pin(fut));        self.ready_tx.send(id).unwrap();   \/\/ \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0430\u0437\u0443 \u0433\u043e\u0442\u043e\u0432\u0430    }    fn run(&amp;mut self) {        while let Ok(id) = self.ready_rx.recv() {            let Some(task) = self.tasks.get_mut(&amp;id) else { continue };            let waker = make_waker(id, self.ready_tx.clone());            let mut cx = Context::from_waker(&amp;waker);            if task.as_mut().poll(&amp;mut cx).is_ready() {                self.tasks.remove(&amp;id);    \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u2014 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c            }            \/\/ Pending: \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0430\u043c\u0430 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 waker        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0435\u0441\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a. \u0414\u043e\u0441\u0442\u0430\u043b\u0438 id \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u043f\u0440\u0438 <code>Ready<\/code> \u0432\u044b\u043a\u0438\u043d\u0443\u043b\u0438. \u041f\u0440\u0438 <code>Pending<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c: \u0437\u0430\u0434\u0430\u0447\u0430 \u0443\u0436\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0430 \u0441\u0432\u043e\u0439 <code>Waker<\/code> \u0438 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0430\u043c\u0430, \u043a\u043e\u0433\u0434\u0430 \u0435\u0451 \u0440\u0430\u0437\u0431\u0443\u0434\u044f\u0442.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043f\u0440\u044f\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0431\u0430\u0433, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u043e\u0440\u044f\u0442 \u0432\u0441\u0435, \u043a\u0442\u043e \u043f\u0438\u0448\u0435\u0442 <code>Future<\/code> \u0440\u0443\u043a\u0430\u043c\u0438. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u0435\u0436\u0438\u0439 <code>Waker<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>poll<\/code>. \u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 future \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u043f\u0440\u043e\u0441\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 <code>Waker<\/code> \u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0440\u044b\u0439. \u0415\u0441\u043b\u0438 \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0432 \u043d\u0435\u0433\u043e, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 (\u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435) \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0443\u0439\u0434\u0451\u0442 \u0432 \u043d\u0438\u043a\u0443\u0434\u0430. \u0414\u0435\u0431\u0430\u0436\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0430\u0434\u0441\u043a\u0438: \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f, \u043d\u043e \u0441\u043f\u0438\u0442. \u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0431\u0430\u0433 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u0432\u0435\u0447\u0435\u0440: \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 <code>Future<\/code> \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0432\u044b\u0439 <code>Waker<\/code>, \u0430 tokio \u043f\u043e\u0441\u043b\u0435 work stealing \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0436\u0434\u0430\u043b \u0437\u0432\u043e\u043d\u043a\u0430 \u0432 \u043d\u043e\u0432\u044b\u0439. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8212; \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c <code>poll<\/code> \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 waker \u0447\u0435\u0440\u0435\u0437 <code>cx.waker().clone()<\/code>, \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0439, \u0447\u0442\u043e <code>Waker<\/code> \u043c\u0435\u0436\u0434\u0443 \u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439.<\/p>\n<h3>\u041a\u0443\u0431\u0438\u043a 4: \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430<\/h3>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u043c\u0443 \u0437\u0432\u043e\u043d\u0438\u0442\u044c \u0432 <code>Waker<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043a\u0435\u0442 \u0433\u043e\u0442\u043e\u0432. \u042d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043a\u0442\u043e\u0440 &#8212; \u043f\u0440\u043e\u0441\u043b\u043e\u0439\u043a\u0430 \u043d\u0430\u0434 <code>epoll<\/code>. \u041e\u043d \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b, \u0441\u043f\u0438\u0442 \u043d\u0430 <code>epoll_wait<\/code>, \u0430 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0431\u0443\u0434\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<pre><code class=\"rust\">struct Reactor {    epoll_fd: RawFd,    wakers: Mutex&lt;HashMap&lt;RawFd, Waker&gt;&gt;,   \/\/ fd -&gt; \u043a\u043e\u0433\u043e \u0431\u0443\u0434\u0438\u0442\u044c}impl Reactor {    fn register(&amp;self, fd: RawFd, waker: Waker) {        self.wakers.lock().unwrap().insert(fd, waker);        epoll_add(self.epoll_fd, fd);       \/\/ EPOLL_CTL_ADD, EPOLLONESHOT    }    fn run(&amp;self) {                          \/\/ \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435        let mut events = [epoll_event::default(); 1024];        loop {            let n = epoll_wait(self.epoll_fd, &amp;mut events, -1); \/\/ \u0441\u043f\u0438\u043c \u0437\u0434\u0435\u0441\u044c            let mut wakers = self.wakers.lock().unwrap();            for ev in &amp;events[..n] {                if let Some(w) = wakers.remove(&amp;ev.fd()) {                    w.wake();                \/\/ \u0431\u0443\u0434\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443, \u0436\u0434\u0430\u0432\u0448\u0443\u044e \u044d\u0442\u043e\u0442 fd                }            }        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>epoll_wait<\/code> \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c <code>-1<\/code> \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0432\u043e \u0432\u0441\u0451\u043c \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u0433\u0434\u0435 \u043f\u043e\u0442\u043e\u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0434\u0440\u0443. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0438 \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 <code>poll<\/code>, \u043b\u0438\u0431\u043e \u0441\u043f\u044f\u0442 \u043d\u0430 \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0412\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0436\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0435\u0441\u0442 CPU: \u043c\u044b \u043d\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043c\u044b \u0441\u043f\u0438\u043c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c <code>epoll_wait<\/code> \u0438 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u043c\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445.<\/p>\n<p>IO-future, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u043a\u0435\u0442 \u0441 \u0440\u0435\u0430\u043a\u0442\u043e\u0440\u043e\u043c, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">impl Future for ReadReady&lt;'_&gt; {    type Output = ();    fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context&lt;'_&gt;) -&gt; Poll&lt;()&gt; {        match self.socket.try_read() {           \/\/ \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0447\u0442\u0435\u043d\u0438\u0435            Ok(_) =&gt; Poll::Ready(()),            Err(e) if e.kind() == WouldBlock =&gt; {                REACTOR.register(self.socket.fd(), cx.waker().clone());                Poll::Pending            }            Err(e) =&gt; panic!(\"io error: {e}\"),        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0435\u0441\u044c \u043f\u0443\u0442\u044c \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443. Future \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043e\u043a\u0435\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 <code>WouldBlock<\/code>, \u043a\u043b\u0430\u0434\u0451\u0442 <code>Waker<\/code> \u0432 \u0440\u0435\u0430\u043a\u0442\u043e\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Pending<\/code>. \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0431\u0435\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442 \u043d\u0430 <code>recv<\/code>. \u0420\u0435\u0430\u043a\u0442\u043e\u0440 \u0441\u043f\u0438\u0442 \u043d\u0430 <code>epoll_wait<\/code>. \u041f\u0440\u0438\u0448\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u044f\u0434\u0440\u043e \u0431\u0443\u0434\u0438\u0442 \u0440\u0435\u0430\u043a\u0442\u043e\u0440, \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0437\u043e\u0432\u0451\u0442 <code>waker.wake()<\/code>, id \u0437\u0430\u0434\u0430\u0447\u0438 \u043b\u0435\u0442\u0438\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 future \u0441\u043d\u043e\u0432\u0430, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. \u041a\u0440\u0443\u0433 \u0437\u0430\u043c\u043a\u043d\u0443\u043b\u0441\u044f, \u0438 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n<h3>\u0412\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439<\/h3>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u0438\u0437 \u043a\u0443\u0441\u043a\u043e\u0432. \u0421\u0442\u0440\u0435\u043b\u043a\u0438 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c async:<\/p>\n<pre><code>         spawn(future)              \u2502              \u25bc      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   poll()    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u2502  \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c  \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25b6 \u2502    Future    \u2502      \u2502 (\u043e\u0447\u0435\u0440\u0435\u0434\u044c id)  \u2502             \u2502 (\u043c\u0430\u0448\u0438\u043d\u0430 \u0441\u043e\u0441\u0442)\u2502      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25c0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518              \u25b2   send(id)   Poll::Pending \u2502              \u2502              + \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c    \u2502 cx.waker().clone()      wake()  \u2502                Waker        \u25bc      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  epoll_wait  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u2502    \u0420\u0435\u0430\u043a\u0442\u043e\u0440    \u2502 \u2500\u2500\u2500\u0441\u043f\u0438\u043c\u2500\u2500\u2500\u25b6  \u2502  \u044f\u0434\u0440\u043e \u041e\u0421     \u2502      \u2502 fd -&gt; Waker   \u2502 \u25c0\u2500\u2500\u0441\u043e\u0431\u044b\u0442\u0438\u0435\u2500\u2500 \u2502   (epoll)    \u2502      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518              \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e: \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 future; \u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Pending<\/code> \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <code>Waker<\/code> \u0432 \u0440\u0435\u0430\u043a\u0442\u043e\u0440\u0435; \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0441\u043f\u0438\u0442 \u043d\u0430 <code>epoll_wait<\/code>; \u044f\u0434\u0440\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438; \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0437\u043e\u0432\u0451\u0442 <code>wake()<\/code>; id \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f. \u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f, \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0440\u0435\u0430\u043a\u0442\u043e\u0440\u0430, \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0431\u0435\u0433\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0437\u0430\u0434\u0430\u0447 \u0438 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0435\u0431\u044f \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435: \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 <code>poll<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>Pending<\/code>, \u043d\u043e \u0437\u0430\u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>Waker<\/code>? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 &#8212; \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u0420\u0435\u0430\u043a\u0442\u043e\u0440 \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u0442, \u043a\u043e\u0433\u043e \u0431\u0443\u0434\u0438\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 id \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430, \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 CPU. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u0441\u043e\u0445\u0440\u0430\u043d\u0438 Waker\u00bb \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f, \u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/h3>\n<p>\u0425\u0432\u0430\u0442\u0438\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0430. \u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u043c Rust \u0431\u0435\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043a\u0440\u0443\u0442\u0438\u0442 100 \u0442\u044b\u0441\u044f\u0447 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u0422\u0430\u0439\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0441\u0442\u043d\u043e: future \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u043f\u0440\u043e\u0441\u0435 \u043e\u0442\u0434\u0430\u0451\u0442 <code>Waker<\/code> \u0444\u043e\u043d\u043e\u0432\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443-\u0442\u0430\u0439\u043c\u0435\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u043d\u0443\u0436\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0432\u043e\u043d\u0438\u0442 \u0432 \u043d\u0435\u0433\u043e. \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0432 <code>main.rs<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <code>cargo run --release<\/code>. \u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u0438\u043d\u043d\u044b\u0439, \u043d\u043e \u044d\u0442\u043e \u0432\u0435\u0441\u044c \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c; \u0447\u0438\u0442\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e \u0441\u0435\u043a\u0446\u0438\u044f\u043c-\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c \u0432\u043d\u0443\u0442\u0440\u0438: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 Waker, \u0437\u0430\u0442\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440, \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c.<\/p>\n<pre><code class=\"rust\">use std::collections::HashMap;use std::future::Future;use std::pin::Pin;use std::sync::mpsc::{channel, Receiver, Sender};use std::sync::{Arc, Mutex};use std::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};use std::thread;use std::time::{Duration, Instant};\/\/ --- Waker \u0447\u0435\u0440\u0435\u0437 RawWakerVTable ---fn make_waker(id: usize, q: Sender&lt;usize&gt;) -&gt; Waker {    type Data = (usize, Sender&lt;usize&gt;);    unsafe fn clone(p: *const ()) -&gt; RawWaker {        let a = Arc::&lt;Data&gt;::from_raw(p as *const Data);        let c = a.clone();        std::mem::forget(a);        RawWaker::new(Arc::into_raw(c) as *const (), &amp;VT)    }    unsafe fn wake(p: *const ()) {        let a = Arc::&lt;Data&gt;::from_raw(p as *const Data);        let _ = a.1.send(a.0);    }    unsafe fn wake_ref(p: *const ()) {        let a = Arc::&lt;Data&gt;::from_raw(p as *const Data);        let _ = a.1.send(a.0);        std::mem::forget(a);    }    unsafe fn drop_d(p: *const ()) { drop(Arc::&lt;Data&gt;::from_raw(p as *const Data)); }    static VT: RawWakerVTable = RawWakerVTable::new(clone, wake, wake_ref, drop_d);    let arc: Arc&lt;Data&gt; = Arc::new((id, q));    let raw = RawWaker::new(Arc::into_raw(arc) as *const (), &amp;VT);    unsafe { Waker::from_raw(raw) }}\/\/ --- Future-\u0442\u0430\u0439\u043c\u0435\u0440: \u0431\u0443\u0434\u0438\u0442 \u0441\u0435\u0431\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a ---struct Timer { when: Instant, registered: bool, shared: Arc&lt;TimerThread&gt; }impl Future for Timer {    type Output = ();    fn poll(mut self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context&lt;'_&gt;) -&gt; Poll&lt;()&gt; {        if Instant::now() &gt;= self.when { return Poll::Ready(()); }        if !self.registered {            self.registered = true;            self.shared.add(self.when, cx.waker().clone());        }        Poll::Pending    }}\/\/ \u041e\u0434\u0438\u043d \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0442\u0430\u0439\u043c\u0435\u0440\u044bstruct TimerThread { tx: Sender&lt;(Instant, Waker)&gt; }impl TimerThread {    fn start() -&gt; Arc&lt;Self&gt; {        let (tx, rx) = channel::&lt;(Instant, Waker)&gt;();        thread::spawn(move || {            let mut pending: Vec&lt;(Instant, Waker)&gt; = Vec::new();            loop {                while let Ok(item) = rx.try_recv() { pending.push(item); }                let now = Instant::now();                pending.retain(|(when, w)| {                    if now &gt;= *when { w.wake_by_ref(); false } else { true }                });                thread::sleep(Duration::from_millis(1));            }        });        Arc::new(TimerThread { tx })    }    fn add(&amp;self, when: Instant, w: Waker) { let _ = self.tx.send((when, w)); }}\/\/ --- \u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c ---struct Executor {    tasks: HashMap&lt;usize, Pin&lt;Box&lt;dyn Future&lt;Output = ()&gt;&gt;&gt;&gt;,    rx: Receiver&lt;usize&gt;,    tx: Sender&lt;usize&gt;,    next: usize,}impl Executor {    fn new() -&gt; Self {        let (tx, rx) = channel();        Executor { tasks: HashMap::new(), rx, tx, next: 0 }    }    fn spawn(&amp;mut self, f: impl Future&lt;Output = ()&gt; + 'static) {        let id = self.next; self.next += 1;        self.tasks.insert(id, Box::pin(f));        let _ = self.tx.send(id);    }    fn run(&amp;mut self) {        while !self.tasks.is_empty() {            let id = self.rx.recv().unwrap();            let Some(t) = self.tasks.get_mut(&amp;id) else { continue };            let w = make_waker(id, self.tx.clone());            let mut cx = Context::from_waker(&amp;w);            if t.as_mut().poll(&amp;mut cx).is_ready() { self.tasks.remove(&amp;id); }        }    }}fn main() {    let timer = TimerThread::start();    let mut ex = Executor::new();    let counter = Arc::new(Mutex::new(0usize));    let n = 100_000;    for i in 0..n {        let timer = timer.clone();        let counter = counter.clone();        ex.spawn(async move {            let ms = 50 + (i % 100) as u64;     \/\/ 50..150 \u043c\u0441            Timer { when: Instant::now() + Duration::from_millis(ms),                    registered: false, shared: timer }.await;            *counter.lock().unwrap() += 1;        });    }    let start = Instant::now();    ex.run();    println!(\"{} \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0437\u0430 {:?} \u0432 \u041e\u0414\u041d\u041e\u041c \u043f\u043e\u0442\u043e\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f\",             *counter.lock().unwrap(), start.elapsed());}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0432\u044b\u0432\u043e\u0434: \u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 \u0441 \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u043e\u043c 50\u2026150 \u043c\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f \u0437\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0445 \u0441\u043d\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0430 \u043d\u0435 \u0447\u0430\u0441\u044b), \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u043f\u043b\u044e\u0441 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a-\u0442\u0430\u0439\u043c\u0435\u0440. \u041f\u0430\u043c\u044f\u0442\u044c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u0438\u0446\u0430\u0445 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0447\u0435\u0441\u0442\u043d\u043e \u0437\u0430\u0432\u0435\u0441\u0442\u0438 100 \u0442\u044b\u0441\u044f\u0447 <code>thread::spawn<\/code> \u0441\u043e <code>sleep<\/code> &#8212; \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0439 Linux-\u043c\u0430\u0448\u0438\u043d\u0435 \u0432\u044b \u0443\u043f\u0440\u0451\u0442\u0435\u0441\u044c \u0432 \u043b\u0438\u043c\u0438\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u0432 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043f\u043e\u0434 \u0441\u0442\u0435\u043a\u0438 \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e. \u0422\u043e\u0447\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u0437\u0430\u043c\u0435\u0440\u044c\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0436\u0435\u043b\u0435\u0437\u0435, \u043d\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c, \u0438 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043c\u044b\u0441\u043b async, \u043f\u043e\u0442\u0440\u043e\u0433\u0430\u043d\u043d\u044b\u0439 \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u041e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443: async-\u044d\u0445\u043e \u043d\u0430 epoll<\/h3>\n<p>\u0422\u0430\u0439\u043c\u0435\u0440 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 async \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u043e\u043a\u0435\u0442\u043e\u0432. \u0417\u0430\u043c\u0435\u043d\u0438\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0439: \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043a\u0430-\u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 <code>epoll<\/code>, \u0430 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u041d\u0438\u0436\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0445\u043e-\u0441\u0435\u0440\u0432\u0435\u0440: \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0432\u0441\u0435 \u043e\u043d\u0438 \u043a\u0440\u0443\u0442\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f, \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d <code>read<\/code>\/<code>write<\/code> \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a. \u0414\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u044b <code>use<\/code> \u0438 \u0445\u0435\u043b\u043f\u0435\u0440\u044b <code>epoll_add<\/code>\/<code>read_nb<\/code>\/<code>accept_nb<\/code> &#8212; \u044d\u0442\u043e \u0442\u043e\u043d\u043a\u0438\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 <code>libc<\/code>-\u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 (<code>epoll_ctl<\/code>, <code>read<\/code>, <code>accept4<\/code>), \u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u043e\u043d\u0438 \u0432 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u043a\u0430\u0436\u0434\u0430\u044f. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0442\u043e\u043b\u044c\u043a\u043e async-\u043b\u043e\u0433\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0435\u043b\u0435\u0442 \u0431\u044b\u043b \u0432\u0438\u0434\u0435\u043d \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<pre><code class=\"rust\">\/\/ \u0420\u0435\u0430\u043a\u0442\u043e\u0440: \u043e\u0434\u0438\u043d epoll \u043d\u0430 \u0432\u0441\u0435\u0445, fd -&gt; Waker \u0436\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438static REACTOR: OnceLock&lt;Reactor&gt; = OnceLock::new();struct Reactor {    epoll: RawFd,    wakers: Mutex&lt;HashMap&lt;RawFd, Waker&gt;&gt;,}impl Reactor {    fn get() -&gt; &amp;'static Reactor { REACTOR.get().unwrap() }    \/\/ future \u0437\u043e\u0432\u0451\u0442 \u044d\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b WouldBlock    fn wait(&amp;self, fd: RawFd, interest: u32, waker: Waker) {        self.wakers.lock().unwrap().insert(fd, waker);        epoll_mod(self.epoll, fd, interest | EPOLLONESHOT); \/\/ ADD \u0438\u043b\u0438 MOD    }    fn run(&amp;self) { \/\/ \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432 \u0444\u043e\u043d\u043e\u0432\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435        let mut evs = [epoll_event::zeroed(); 1024];        loop {            let n = epoll_wait(self.epoll, &amp;mut evs, -1);   \/\/ \u0441\u043f\u0438\u043c \u0442\u0443\u0442            let mut map = self.wakers.lock().unwrap();            for ev in &amp;evs[..n] {                if let Some(w) = map.remove(&amp;(ev.u64 as RawFd)) {                    w.wake();                                \/\/ \u0431\u0443\u0434\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443                }            }        }    }}\/\/ Future \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043a\u0435\u0442\u0430: poll \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Ready, \u043a\u043e\u0433\u0434\u0430 fd \u0433\u043e\u0442\u043e\u0432struct Ready { fd: RawFd, interest: u32, armed: bool }impl Future for Ready {    type Output = ();    fn poll(mut self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context&lt;'_&gt;) -&gt; Poll&lt;()&gt; {        if self.armed {            \/\/ \u043d\u0430\u0441 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u043b \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u2014 fd \u0433\u043e\u0442\u043e\u0432            self.armed = false;            return Poll::Ready(());        }        self.armed = true;        Reactor::get().wait(self.fd, self.interest, cx.waker().clone());        Poll::Pending    }}\/\/ \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u043a async-\u0437\u0430\u0434\u0430\u0447\u0430async fn serve(fd: RawFd) {    let mut buf = [0u8; 4096];    loop {        \/\/ \u0436\u0434\u0451\u043c, \u043f\u043e\u043a\u0430 \u0432 \u0441\u043e\u043a\u0435\u0442\u0435 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435        Ready { fd, interest: EPOLLIN, armed: false }.await;        let n = match read_nb(fd, &amp;mut buf) {            Ok(0) =&gt; break,                 \/\/ \u043a\u043b\u0438\u0435\u043d\u0442 \u0437\u0430\u043a\u0440\u044b\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435            Ok(n) =&gt; n,            Err(WouldBlock) =&gt; continue,    \/\/ \u043b\u043e\u0436\u043d\u043e\u0435 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u2014 \u0436\u0434\u0451\u043c \u0435\u0449\u0451            Err(_) =&gt; break,        };        \/\/ \u044d\u0445\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e, \u0431\u0435\u0437 \u0434\u043e\u0441\u044b\u043b\u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439)        Ready { fd, interest: EPOLLOUT, armed: false }.await;        let _ = write_nb(fd, &amp;buf[..n]);    }    close(fd);}fn main() {    REACTOR.set(Reactor::new()).ok();    thread::spawn(|| Reactor::get().run());    let listener = listen_nonblocking(\"127.0.0.1:8080\");    let mut ex = Executor::new();    \/\/ \u0437\u0430\u0434\u0430\u0447\u0430-\u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u043f\u0430\u0432\u043d\u0438\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 serve()    ex.spawn(async move {        loop {            Ready { fd: listener, interest: EPOLLIN, armed: false }.await;            while let Ok(conn) = accept_nb(listener) {                set_nonblocking(conn);                SPAWNER.spawn(serve(conn));  \/\/ \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435            }        }    });    ex.run();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u0447\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438: \u0447\u0442\u043e\u0431\u044b \u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440 \u043c\u043e\u0433 \u0441\u043f\u0430\u0432\u043d\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f, \u043e\u0447\u0435\u0440\u0435\u0434\u044c <code>spawn<\/code> \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0438\u0439 <code>Spawner<\/code> (\u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e\u0442 \u0436\u0435 <code>Sender<\/code> \u043f\u043b\u044e\u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0437\u0430\u0434\u0430\u0447 \u0437\u0430 <code>Mutex<\/code>), \u0430 <code>ex.run()<\/code> \u0442\u044f\u043d\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e. \u042d\u0442\u043e \u043f\u0430\u0440\u0430 \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0430\u0448\u0435\u0433\u043e <code>Executor<\/code> \u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u0441 \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c\u0438. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: <code>cargo run --release<\/code>, \u0437\u0430\u0442\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 <code>nc 127.0.0.1 8080<\/code> \u0438 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e &#8212; \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0445\u043e. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 \u0441\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 <code>nc<\/code> &#8212; \u0432\u0441\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u043f\u043b\u044e\u0441 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0440\u0435\u0430\u043a\u0442\u043e\u0440\u0430. \u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u043a\u0430-\u0442\u0430\u0439\u043c\u0435\u0440, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 tokio \u0432 \u043c\u0438\u043d\u0438\u0430\u0442\u044e\u0440\u0435: \u0430\u043a\u0446\u0435\u043f\u0442\u043e\u0440, \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 <code>epoll<\/code>, \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c <code>.await<\/code>.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>EPOLLONESHOT<\/code> \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e <code>wait<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0440\u0443\u0433\u0435 \u0446\u0438\u043a\u043b\u0430. \u0411\u0435\u0437 <code>ONESHOT<\/code> \u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 <code>epoll<\/code> \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u0434\u0438\u0442\u044c \u043d\u0430\u0441 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0432 \u0441\u043e\u043a\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c busy-loop. \u0421 <code>ONESHOT<\/code> \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f\u00bb \u0441 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f, \u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0430\u043c\u0430 \u043f\u0435\u0440\u0435\u0432\u0437\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043d\u043e\u0432\u0430 \u0433\u043e\u0442\u043e\u0432\u0430 \u0436\u0434\u0430\u0442\u044c. \u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0433\u0440\u0430\u043d\u044c, \u043e\u0431 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043f\u043e\u0442\u044b\u043a\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435, \u043a\u0442\u043e \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0438\u0448\u0435\u0442 \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<h3>\u0427\u0435\u043c tokio \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0443\u0448\u043a\u0438<\/h3>\n<p>\u0421\u043a\u0435\u043b\u0435\u0442 \u0433\u043e\u0442\u043e\u0432, \u0438 \u0432 \u043d\u0451\u043c \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0438\u0434\u0435\u0438 tokio: \u043c\u0430\u0448\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, <code>Waker<\/code> \u043d\u0430 vtable, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f, \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u043d\u0430 <code>epoll<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 tokio \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0438, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0431\u043e\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u0438\u0433\u0440\u0443\u0448\u043a\u0435 \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0448\u044c \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 work stealing. \u041d\u0430\u0448 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439. Tokio \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0443\u043b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u044f\u0434\u0435\u0440, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f lock-free \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043b\u044e\u0441 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f. \u041f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u043e\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u0441\u0435\u0434\u0430. \u041e\u0442\u0441\u044e\u0434\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 <code>Send<\/code> \u043d\u0430 \u0441\u043f\u0430\u0432\u043d\u044f\u0449\u0438\u0435\u0441\u044f future: \u0437\u0430\u0434\u0430\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0435 \u043d\u0430 \u0442\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0433\u0434\u0435 \u0437\u0430\u0441\u043d\u0443\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u043d\u0430 \u0442\u0430\u0449\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>.await<\/code>, \u043e\u0431\u044f\u0437\u0430\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 async \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430 \u044d\u0442\u043e.<\/p>\n<p>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 <code>.await<\/code>-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 syscall \u0438\u043b\u0438 \u0442\u044f\u0436\u0451\u043b\u044b\u0439 \u0441\u0447\u0451\u0442, \u043e\u043d\u0430 \u0437\u0430\u0441\u0442\u043e\u043f\u043e\u0440\u0438\u0442 \u0432\u0435\u0441\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. Tokio \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0442\u0430\u043a\u043e\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b \u0447\u0435\u0440\u0435\u0437 <code>spawn_blocking<\/code>. \u0423 \u043d\u0430\u0441 \u044d\u0442\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u044b \u043d\u0435\u0442 \u0432\u043e\u0432\u0441\u0435.<\/p>\n<p>\u0422\u0430\u0439\u043c\u0435\u0440\u044b. \u041d\u0430\u0448 \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 <code>Vec<\/code> \u0441 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c \u0441\u043a\u0430\u043d\u043e\u043c &#8212; \u044d\u0442\u043e O(n) \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a, \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445 \u0441\u043c\u0435\u0440\u0442\u044c. Tokio \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0435\u0441\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 (hierarchical timing wheel) \u0441 \u043f\u043e\u0447\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439.<\/p>\n<p>IO-\u0434\u0440\u0430\u0439\u0432\u0435\u0440. \u0423 \u043d\u0430\u0441 \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u044d\u0442\u043e <code>HashMap<\/code> \u043f\u043e\u0434 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u043c \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a. Tokio \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0441 \u043f\u0430\u0440\u043a\u043e\u0432\u043a\u043e\u0439 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432: \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0435\u0447\u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0441\u0430\u043c \u0438\u0434\u0451\u0442 \u043a\u0440\u0443\u0442\u0438\u0442\u044c <code>epoll_wait<\/code>, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043b\u0438\u0448\u043d\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u043b\u044e\u0441 \u043d\u0430 \u0441\u0432\u0435\u0436\u0438\u0445 \u044f\u0434\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434 \u043d\u0430 <code>io_uring<\/code>.<\/p>\n<p>\u0421\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0442\u0435 \u0436\u0435. \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c tokio \u043d\u0435 \u0432 \u0438\u0434\u0435\u044f\u0445, \u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438 \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043a\u0435 \u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u043c\u0438 \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/p>\n<h3>\u0427\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0445\u043e\u043b\u0438\u0432\u0430\u0440, \u043e\u0442\u0432\u0435\u0447\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435.<\/p>\n<p>\u00ab\u042d\u0442\u043e \u0436\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c, \u0443 \u0442\u0435\u0431\u044f busy-loop \u0432 \u0442\u0430\u0439\u043c\u0435\u0440\u0435\u00bb. \u0412 \u0434\u0435\u043c\u043e-\u0442\u0430\u0439\u043c\u0435\u0440\u0435 \u0434\u0430, \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0441 <code>sleep(1ms)<\/code> \u0440\u0430\u0434\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u0430. \u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0442\u0430\u0439\u043c\u0435\u0440\u0444\u0434 \u0432 \u0442\u043e\u043c \u0436\u0435 <code>epoll<\/code>, \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u043d\u0435\u0442. \u0421\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0447\u0435\u0441\u0442\u043d\u044b\u0439: \u043e\u043d \u0441\u043f\u0438\u0442 \u043d\u0430 <code>recv<\/code> \u0438 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445.<\/p>\n<p>\u00ab\u0417\u0430\u0447\u0435\u043c <code>Box::pin<\/code>, \u044d\u0442\u043e \u0436\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443\u00bb. \u0414\u043b\u044f \u0433\u0435\u0442\u0435\u0440\u043e\u0433\u0435\u043d\u043d\u043e\u0433\u043e <code>HashMap<\/code> \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0443\u0442\u0443\u0440 &#8212; \u0434\u0430, \u043f\u0440\u043e\u0449\u0435 \u0431\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c. tokio \u0438\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u044d\u0442\u043e\u0433\u043e, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0434\u043d\u0438\u043c \u0431\u043b\u043e\u043a\u043e\u043c \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u043d\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u044b\u0440\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043d\u043e \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0448\u0430\u0435\u0442.<\/p>\n<p>\u00ab<code>Arc::from_raw<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 vtable \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0443\u0442\u043a\u043e\u00bb. \u0422\u0430\u043a \u0438 \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0440\u0443\u0447\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0432\u044b \u0431\u0435\u0440\u0451\u0442\u0435 <code>Waker<\/code> \u0438\u0437 <code>futures::task::waker<\/code> \u0438\u043b\u0438 \u0438\u0437 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430 \u0438 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442\u0435 vtable \u0440\u0443\u043a\u0430\u043c\u0438. \u041d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u043e\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u00ab\u0423 \u0442\u0435\u0431\u044f \u0432 \u0440\u0435\u0430\u043a\u0442\u043e\u0440\u0435 \u043e\u0434\u0438\u043d <code>Waker<\/code> \u043d\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 &#8212; \u0430 \u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u0442\u0430\u0441\u043a\u0430 \u0436\u0434\u0443\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 fd?\u00bb. \u0421\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e: <code>HashMap&lt;RawFd, Waker&gt;<\/code> \u0437\u0430\u0442\u0438\u0440\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0436\u0434\u0443\u0449\u0435\u0433\u043e, \u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043a\u0435\u0440\u043e\u0432 \u043d\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043f\u043b\u044e\u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430\u0445 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e fd \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u0441\u043b\u043e\u0442\u043e\u0432 \u043f\u043e\u0434 <code>read<\/code>\/<code>write<\/code> \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435. \u0412 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u044f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0434\u0435\u0440\u0436\u0443 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0442\u043e\u043d\u0443\u0442\u044c \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445, \u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>\u00ab\u041e\u0442\u043a\u0443\u0434\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 <code>'static<\/code> \u043d\u0430 \u0441\u043f\u0430\u0432\u043d\u0435\u00bb. \u0417\u0430\u0434\u0430\u0447\u0430 \u0436\u0438\u0432\u0451\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u0430 \u043a \u0441\u0442\u0435\u043a-\u0444\u0440\u0435\u0439\u043c\u0443 \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u0435\u0451 \u0437\u0430\u0441\u043f\u0430\u0432\u043d\u0438\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0434\u0430\u043b\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0447\u0435, \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043b\u0430\u0434\u0435\u0442\u044c &#8212; \u043e\u0442\u0441\u044e\u0434\u0430 <code>move<\/code> \u0432 <code>async move<\/code> \u0438 <code>'static<\/code> \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 <code>spawn<\/code>. \u042d\u0442\u043e \u043d\u0435 \u043a\u0430\u043f\u0440\u0438\u0437, \u0430 \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e future \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0430.<\/p>\n<p>\u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 async-std \/ smol \/ glommio\u00bb. Smol \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u0434\u0435\u0439\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438, \u0438 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. Glommio \u044d\u0442\u043e thread-per-core \u043f\u043e\u0432\u0435\u0440\u0445 <code>io_uring<\/code> &#8212; \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430.<\/p>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0421\u0432\u043e\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0432 \u043f\u0440\u043e\u0434\u0435: \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c tokio, \u0438 \u043e\u0431\u043e\u0433\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u043d\u0435\u043b\u044c\u0437\u044f. \u041d\u043e \u043a\u0430\u043a \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u044b\u0431\u0438\u0442\u044c \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u0441\u043b\u043e\u0432\u043e \u00ab\u043c\u0430\u0433\u0438\u044f\u00bb \u043e\u043d \u0431\u0435\u0441\u0446\u0435\u043d\u0435\u043d. \u0421\u043e\u0431\u0440\u0430\u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 <code>Future \u2192 Waker \u2192 \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u2192 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c<\/code> \u0440\u0443\u043a\u0430\u043c\u0438, \u0432\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430 <code>.await<\/code> \u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0433\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u0441\u044b\u043f\u0430\u0435\u0442, \u043a\u0442\u043e \u0435\u0451 \u0431\u0443\u0434\u0438\u0442 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 <code>Pin<\/code>, <code>Send<\/code> \u0438 <code>'static<\/code> \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442.<\/p>\n<p>\u042d\u0445\u043e-\u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u0430\u0440\u043a\u0430\u0441: \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a \u043d\u0435\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0439\u043c\u0435\u0440\u0444\u0434 \u0432 \u0442\u043e\u043c \u0436\u0435 <code>epoll<\/code> \u0438 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 \u0433\u043e\u043b\u043e\u0439 <code>std<\/code>. \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043b\u043e\u044f\u043c\u0438 \u043b\u043e\u0436\u0430\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 work stealing, \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438 tokio \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0435 \u043f\u043e \u0432\u0435\u0440\u0445\u0430\u043c, \u0430 \u043f\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0443\u043c. <a href=\"https:\/\/rust-lang.github.io\/async-book\/\" rel=\"noopener noreferrer nofollow\">Async Book<\/a> \u0441 \u0433\u043b\u0430\u0432\u043e\u0439, \u0433\u0434\u0435 <code>Waker<\/code> \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0443 \u043d\u0430\u0441. \u0421\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u00abAsync\/await\u00bb \u0423\u0438\u043b\u043b\u0430 \u041a\u0440\u0430\u0439\u0442\u043e\u043d\u0430 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u00abTasks\u00bb \u0432 \u0431\u043b\u043e\u0433\u0435 tokio \u043f\u0440\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/github.com\/smol-rs\/smol\" rel=\"noopener noreferrer nofollow\"><code>smol<\/code><\/a> &#8212; \u043e\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0432\u0435\u0447\u0435\u0440, \u0430 \u0438\u0434\u0435\u0438 \u0440\u043e\u0432\u043d\u043e \u0442\u0435 \u0436\u0435. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/index.html\" rel=\"noopener noreferrer nofollow\"><code>std::task<\/code><\/a>, \u0433\u0434\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/task\/struct.RawWakerVTable.html\" rel=\"noopener noreferrer nofollow\"><code>RawWakerVTable<\/code><\/a> \u043e\u043f\u0438\u0441\u0430\u043d \u0431\u0435\u0437 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432. \u041d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0435\u0440\u0438\u044f <a href=\"https:\/\/habr.com\/ru\/companies\/beget\/articles\/854104\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 Rust \u0432 \u0442\u0440\u0451\u0445 \u0447\u0430\u0441\u0442\u044f\u0445\u00bb<\/a> (\u043f\u0435\u0440\u0435\u0432\u043e\u0434 Jack O\u2019Connor \u0432 \u0431\u043b\u043e\u0433\u0435 Beget) &#8212; \u0442\u0430\u043c \u0442\u043e\u0442 \u0436\u0435 \u043f\u0443\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0441 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0439 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u0430 \u0438 \u0444\u0438\u0440\u043c\u0435\u043d\u043d\u044b\u043c \u0431\u0430\u0433\u043e\u043c \u00absleep forever?\u00bb. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 &#8212; \u0432\u0430\u043c \u0442\u0443\u0434\u0430.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e, \u043d\u0430 \u0441\u043b\u0430\u0434\u043a\u043e\u0435. \u0420\u0430\u0437 <code>async fn<\/code> \u044d\u0442\u043e \u043c\u0430\u0448\u0438\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0432\u0438\u0433\u0430\u0435\u0442 <code>poll<\/code>, \u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 <code>.await<\/code>-\u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0435 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u0432\u0435\u0441\u044c \u043f\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438. \u042d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 classic-\u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u00ab\u043f\u043e\u043b\u043e\u0436\u0438\u043b <code>std::fs::read<\/code> \u0432 async-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u0441\u0442\u0430\u043b\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443: \u043f\u043e\u043a\u0430 <code>poll<\/code> \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0438\u043a\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<p>\u042f \u043a\u043e\u043f\u0430\u044e Rust \u0438 async \u043d\u0430 \u044d\u0442\u043e\u043c \u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0435 &#8212; \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442: <a href=\"https:\/\/t.me\/+DxARKkdhpskwODFi\" rel=\"noopener noreferrer nofollow\">@rust_code<\/a>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0448\u043b\u043e, \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0439\u0442\u0435, \u0442\u0430\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0439\u0434\u0451\u0442, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0443 work stealing \u0432\u043f\u043b\u043e\u0442\u043d\u0443\u044e: lock-free \u0434\u0435\u043a\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u043e\u0440\u043e\u0432\u0441\u0442\u0432\u0430 \u0438\u0437 \u0445\u0432\u043e\u0441\u0442\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 ABA \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439. \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043a\u043e\u043f\u0430\u0442\u044c \u043b\u0438 \u0432 \u044d\u0442\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0438 \u043d\u0430\u043a\u0438\u0434\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0435\u0449\u0451 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 async \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1050160\/\">https:\/\/habr.com\/ru\/articles\/1050160\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e Rust-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 .await, \u0432 \u043e\u0442\u0432\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0432\u0443\u0447\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e \u00ab\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\u00bb. \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0434\u0443\u043c\u0430\u0435\u0442\u00bb \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0430 .await \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 enum \u0438 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e.\u042f \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043f\u0438\u0441\u0430\u043b async-\u043a\u043e\u0434 \u043d\u0430 tokio, \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0447\u0435\u0440\u043d\u043c \u044f\u0449\u0438\u043a\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u043b\u0435\u0437\u0442\u044c. \u0421\u043b\u043e\u043c\u0430\u043b\u0441\u044f \u044d\u0442\u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439 \u0432 \u0442\u043e\u0442 \u0434\u0435\u043d\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u043b\u0430 \u043e\u0434\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430: \u043f\u043e \u043b\u043e\u0433\u0430\u043c \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u043b\u0430\u0441\u044c. \u042f \u043f\u043e\u0442\u0435\u0440\u044f\u043b \u043d\u0430 \u043d\u0435\u0439 \u0432\u0435\u0447\u0435\u0440, \u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0440\u043e Waker, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0435\u0449\u0451 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f. \u0422\u043e\u0433\u0434\u0430 \u044f \u043f\u043b\u044e\u043d\u0443\u043b \u0438 \u0437\u0430 \u043f\u0430\u0440\u0443 \u0432\u0435\u0447\u0435\u0440\u043e\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0441 \u043d\u0443\u043b\u044f &#8212; \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432\u0435\u0441\u044c \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442 \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u0441\u0435\u0441\u0442 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 200 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438 \u0442\u043e\u0442 \u0431\u0430\u0433 \u0441\u0442\u0430\u043b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 tokio \u043d\u0430\u0447\u0430\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043a\u043d\u0438\u0433\u0430, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0437\u0430\u043a\u043b\u0438\u043d\u0430\u043d\u0438\u0435.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 async-\u0440\u0430\u043d\u0442\u0430\u0439\u043c \u043d\u0430 \u0433\u043e\u043b\u043e\u0439 std, \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0411\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043f\u043e\u043b\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430: \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0440\u0443\u0442\u0438\u0442 \u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u0434\u0430\u0447 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0438 async-\u044d\u0445\u043e-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 epoll, \u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043e\u0442\u043d\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0442\u0435\u043c \u0436\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c. \u041f\u043e \u0434\u043e\u0440\u043e\u0433\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430\u0445 \u0431\u0435\u0440\u0443\u0442\u0441\u044f Pin, Send \u0438 &#8216;static, \u043f\u043e\u0447\u0435\u043c\u0443 Waker \u0441\u0434\u0435\u043b\u0430\u043d \u0442\u0430\u043a \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0438 \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e tokio \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0430\u0448\u0435\u0439 \u0438\u0433\u0440\u0443\u0448\u043a\u0438.TL;DR. async fn \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0448\u0438\u043d\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (enum). \u0420\u0430\u043d\u0442\u0430\u0439\u043c \u044d\u0442\u043e \u0442\u0440\u0438 \u043a\u0443\u0431\u0438\u043a\u0430: Future \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0433 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u00ab\u0433\u043e\u0442\u043e\u0432\u043e\u00bb \u0438\u043b\u0438 \u00ab\u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441\u00bb; \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0438\u0445; \u0440\u0435\u0430\u043a\u0442\u043e\u0440 \u0441\u043f\u0438\u0442 \u043d\u0430 epoll_wait \u0438 \u0431\u0443\u0434\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0433\u0434\u0430 \u041e\u0421 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043a\u0435\u0442\u0430. \u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 Waker &#8212; \u043a\u043e\u043b\u0431\u044d\u043a \u00ab\u0432\u0435\u0440\u043d\u0438 \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u00bb. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e busy-wait: \u0441\u043f\u044f\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u043e\u043b\u044c.\u0421\u0442\u0430\u0442\u044c\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0436\u0435 \u043f\u0438\u0448\u0435\u0442 \u043d\u0430 Rust \u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f async\/.await, \u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f tokio \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043a \u043a\u043e\u043d\u0446\u0443 \u043e\u043d \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0451\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c.\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u00ab\u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430. \u0421\u0442\u0435\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e 8 \u041c\u0411 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a \u0432 Linux; \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u043e \u043c\u0430\u043b\u043e, \u043d\u0430 100 \u0442\u044b\u0441\u044f\u0447\u0430\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u044b \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0432 \u043b\u0438\u043c\u0438\u0442\u044b, \u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u044f\u0434\u0440\u0430 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. Async \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u0438 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u0442\u044b\u0441\u044f\u0447 \u0437\u0430\u0434\u0430\u0447, \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u044d\u0442\u043e \u043d\u0435 syscall, \u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.\u0426\u0438\u0444\u0440\u044b, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0451 \u0437\u0430\u0442\u0435\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0443\u0441\u0442\u0430\u044f async-\u0437\u0430\u0434\u0430\u0447\u0430 \u0432 tokio \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 \u043f\u043b\u044e\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u0435\u0451 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u0451\u0442 \u0432 \u0441\u043e\u0442\u043d\u044f\u0445 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442, \u0430 \u043d\u0435 \u0432 \u0442\u0435\u0440\u0430\u0431\u0430\u0439\u0442\u0430\u0445 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a\u0438. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043f\u044f\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u043d\u0443\u043b\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0451 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435.\u0413\u0440\u0443\u0431\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043d\u0430 100 000 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u00ab\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0436\u0434\u0443\u0449\u0438\u0445\u00bb \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432:\u041f\u043e\u0442\u043e\u043a \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443Async-\u0437\u0430\u0434\u0430\u0447\u0430\u041f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443~8 \u041c\u0411 \u0432\u0438\u0440\u0442. \u0441\u0442\u0435\u043a\u0430~\u0441\u043e\u0442\u043d\u0438 \u0431\u0430\u0439\u0442 + \u0440\u0430\u0437\u043c\u0435\u0440 future100k \u0435\u0434\u0438\u043d\u0438\u0446\u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u0438\u043c\u0438\u0442\u044b \u041e\u0421\u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u041c\u0411\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435syscall, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u044f\u0434\u0440\u0430\u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u041a\u0442\u043e \u0431\u0443\u0434\u0438\u0442\u044f\u0434\u0440\u043e \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443\/\u0441\u0438\u0433\u043d\u0430\u043b\u0443Waker \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e epoll\u0426\u0438\u0444\u0440\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439: \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043d\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u044b, \u0430 \u0432 \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u043e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.\u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u044b \u0442\u0440\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e:Future &#8212; \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c (poll) \u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u00ab\u0433\u043e\u0442\u043e\u0432\u043e, \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u00bb \u043b\u0438\u0431\u043e \u00ab\u043d\u0435 \u0441\u0435\u0439\u0447\u0430\u0441, \u0440\u0430\u0437\u0431\u0443\u0436\u0443 \u043f\u043e\u0437\u0436\u0435\u00bb.\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c (executor) &#8212; \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.\u0420\u0435\u0430\u043a\u0442\u043e\u0440 (reactor) &#8212; \u043c\u043e\u0441\u0442 \u043a \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 epoll\/kqueue\/IOCP \u0436\u0434\u0451\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 \u0438 \u0431\u0443\u0434\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438.async fn \u044d\u0442\u043e enum: \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445\u0421\u0430\u043c\u043e\u0435 \u0436\u0438\u0432\u0443\u0447\u0435\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e async \u0432 Rust &#8212; \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c \u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0442\u0435\u043a\u0430\u043c\u0438. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:async fn handle(mut sock: TcpStream) -&gt; usize {    let mut buf = [0u8; 1024];    let n = sock.read(&amp;mut buf).await;   \/\/ \u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u21161    process(&amp;buf[..n]);    n}\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0451 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0441\u0442\u0435\u043a\u0435. \u041e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043f-\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 .await \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0432\u0441\u0451, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u044f:enum HandleFuture {    Start { sock: TcpStream },    AwaitingRead { sock: TcpStream, buf: [u8; 1024], read: ReadFuture },    Done,}poll \u044d\u0442\u043e match \u043f\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0448\u0430\u0433, \u043f\u0440\u0438 .await \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u043b\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c Pending, \u043f\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443. \u0420\u0430\u0437\u043c\u0435\u0440 future \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043f\u043e\u0434 \u0441\u0442\u0435\u043a \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0443\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0441\u0430\u043c\u043e\u0433\u043e \u00ab\u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e\u00bb \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0436\u0438\u0432\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u0442\u0441\u044e\u0434\u0430 \u0438 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u0430\u044f \u0431\u043e\u043b\u044c \u0441 \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u043c\u0438 \u0444\u0443\u0442\u0443\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 clippy \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u0442 \u0431\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u043d\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f: \u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 -Z print-type-sizes, \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0447\u0435\u0441\u0442\u043d\u043e \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0430\u0448\u0435\u0439 \u0444\u0443\u0442\u0443\u0440\u044b \u0432 \u0431\u0430\u0439\u0442\u0430\u0445. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 rustc \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043d\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f:print-type-size type: `HandleFuture`: 1040 bytes, alignment: 8 bytesprint-type-size     variant `AwaitingRead`: 1040 bytesprint-type-size         field `.buf`: 1024 bytesprint-type-size         field `.sock`: 8 bytesprint-type-size         field `.read`: 8 bytesprint-type-size     variant `Start`: 8 bytesprint-type-size     variant `Done`: 0 bytes\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0432\u0435\u0441 \u0444\u0443\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430\u0448 buf \u043d\u0430 1024 \u0431\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c .await, \u043f\u043b\u044e\u0441 \u043c\u0435\u043b\u043e\u0447\u044c \u043f\u043e\u0434 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0447\u043a\u0443 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0432 future. \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 .await, \u0438\u043d\u0430\u0447\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0435\u0451 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438.\u0418\u0437 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0442\u0435\u043a\u0430\u0435\u0442 Pin. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 AwaitingRead \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 read \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 buf, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u042d\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0442\u0438\u043f: \u0441\u0434\u0432\u0438\u043d\u0435\u0442\u0435 \u0435\u0433\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 &#8212; \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0441\u044f\u0447\u0435\u0439. Pin \u044d\u0442\u043e \u0442\u0438\u043f\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u00ab\u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0434\u0435\u0442\u00bb. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 poll \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 Pin&lt;&amp;mut Self&gt;, \u0430 \u043d\u0435 &amp;mut Self. \u041d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0430\u043c\u043e\u0441\u0441\u044b\u043b\u043e\u043a &#8212; \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u0438 Pin.\u041a\u0443\u0431\u0438\u043a 1: Future \u0438 \u0435\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u0412\u0435\u0441\u044c \u0442\u0440\u0435\u0439\u0442:pub trait Future {    type Output;    fn poll(self: Pin&lt;&amp;mut Self&gt;, cx: &amp;mut Context&lt;&#8216;_&gt;) -&gt; Poll&lt;Self::Output&gt;;}pub enum Poll&lt;T&gt; { Ready(T), Pending }\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u0438 \u0432\u0430\u0436\u043d\u044b\u0439: \u0435\u0441\u043b\u0438 poll \u0432\u0435\u0440\u043d\u0443\u043b Pending, future \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c Waker \u0438\u0437 cx \u0438 \u043f\u043e\u0437\u0436\u0435 \u0434\u0451\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0448\u0430\u043d\u0441 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044c\u0441\u044f. \u041d\u0430\u0440\u0443\u0448\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 &#8212; \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u043f\u0440\u043e\u0441\u0438\u0442, \u0438 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u042d\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0434\u043e\u0431\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u00ab\u043f\u043e\u0434\u0432\u0438\u0441\u0448\u0438\u0445\u00bb async-\u0431\u0430\u0433\u043e\u0432 \u0432 \u0440\u0443\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435.\u041a\u0443\u0431\u0438\u043a 2: Waker, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440Waker \u044d\u0442\u043e \u043a\u043e\u043b\u0431\u044d\u043a \u00ab\u043f\u043e\u043b\u043e\u0436\u0438 \u043c\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f\u00bb. \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0442\u0443\u0442 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0431\u044b Box&lt;dyn Fn()&gt;. \u041d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 Waker \u0440\u0443\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0439 trait-\u043e\u0431\u044a\u0435\u043a\u0442: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u044e\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.pub struct RawWaker {    data: *const (),    vtable: &amp;&#8217;static RawWakerVTable,}pub struct RawWakerVTable {    clone: unsafe fn(*const ()) -&gt; RawWaker,    wake: unsafe fn(*const ()),    wake_by_ref: unsafe fn(*const ()),    drop: unsafe fn(*const ()),}\u0417\u0430\u0447\u0435\u043c \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e? \u0417\u0430\u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f Waker \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u044b: \u043d\u0430\u0448 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c, \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 tokio \u0441 work stealing, block_on, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0430\u0440\u043a\u0443\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u044e vtable \u0438 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043a\u043e\u0434 future \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c: \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043e\u0432\u0451\u0442 waker.wake() \u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442. \u042d\u0442\u043e \u0440\u0443\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c &#8212; \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u044f\u0447\u0435\u0442 \u0440\u0430\u043d\u0442\u0430\u0439\u043c.\u041d\u0430\u0448 Waker \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u0430\u043d\u0430\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f. \u0414\u0451\u0440\u043d\u0443\u043b\u0438 wake &#8212; \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u0435\u0442\u0435\u043b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:fn make_waker(task_id: usize, queue: Sender&lt;usize&gt;) -&gt; Waker {    let data = Arc::new((task_id, queue));    unsafe fn clone(ptr: *const ()) -&gt; RawWaker {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        let cloned = arc.clone();        std::mem::forget(arc);        RawWaker::new(Arc::into_raw(cloned) as *const (), &amp;VTABLE)    }    unsafe fn wake(ptr: *const ()) {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        arc.1.send(arc.0).ok();    }    unsafe fn wake_by_ref(ptr: *const ()) {        let arc = Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _);        arc.1.send(arc.0).ok();        std::mem::forget(arc);    }    unsafe fn drop_fn(ptr: *const ()) {        drop(Arc::&lt;(usize, Sender&lt;usize&gt;)&gt;::from_raw(ptr as *const _));    }    static VTABLE: RawWakerVTable =        RawWakerVTable::new(clone, wake, wake_by_ref, drop_fn);    let raw = RawWaker::new(Arc::into_raw(data) as *const (), &amp;VTABLE);    unsafe { Waker::from_raw(raw) }}\u0417\u0434\u0435\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043d\u0438 \u0441\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u0441\u044b\u043b\u043e\u043a Arc \u0438 unsafe &#8212; \u044d\u0442\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u041b\u043e\u0433\u0438\u043a\u0430 \u0436\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430: \u0440\u0430\u0437\u0431\u0443\u0434\u0438\u043b\u0438 &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 id \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u0434\u0438\u043d \u0440\u0430\u0437, \u0440\u043e\u0432\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e.\u041a\u0443\u0431\u0438\u043a 3: \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0432 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0441\u0442\u0440\u043e\u043a\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0445\u0440\u0430\u043d\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043a\u0440\u0443\u0442\u0438\u0442 \u0446\u0438\u043a\u043b. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u044d\u0442\u043e \u043a\u0430\u043d\u0430\u043b \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438.type BoxFuture = Pin&lt;Box&lt;dyn Future&lt;Output = ()&gt;&gt;&gt;;struct Executor {    tasks: HashMap&lt;usize, BoxFuture&gt;,    ready_rx: Receiver&lt;usize&gt;,    ready_tx: Sender&lt;usize&gt;,    next_id: usize,}impl Executor {    fn spawn(&amp;mut self, fut: impl Future&lt;Output = ()&gt; + &#8216;static) {        let id = self.next_id;        self.next_id += 1;        self.tasks.insert(id, Box::pin(fut));        self.ready_tx.send(id).unwrap();   \/\/ \u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0440\u0430\u0437\u0443 \u0433\u043e\u0442\u043e\u0432\u0430    }    fn run(&amp;mut self) {        while let Ok(id) = self.ready_rx.recv() {            let Some(task) = self.tasks.get_mut(&amp;id) else { continue };            let waker = make_waker(id, self.ready_tx.clone());            let mut cx = Context::from_waker(&amp;waker);           &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-484437","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/484437","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=484437"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/484437\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=484437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=484437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=484437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}