{"id":335611,"date":"2022-07-12T09:00:17","date_gmt":"2022-07-12T09:00:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=335611"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=335611","title":{"rendered":"<span>19 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Python. \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u0427\u0430\u0441\u0442\u044c 5. \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/37c\/042\/697\/37c04269773b34c06e7a000ab237ec3c.png\" width=\"732\" height=\"355\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/37c\/042\/697\/37c04269773b34c06e7a000ab237ec3c.png\"\/><figcaption><\/figcaption><\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/676136\/\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0448\u0435<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043a\u0430\u043a \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u043e\u043b\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0415\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u043d\u044c\u0448\u0435<\/a> \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f <code>selectors<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043e\u0431\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 (coroutines).<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b01\/c21\/e6a\/b01c21e6afb0e9f8e514a2e589093a2e.png\" alt=\"\u0414\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Python, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438\" title=\"\u0414\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Python, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438\" width=\"467\" height=\"355\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b01\/c21\/e6a\/b01c21e6afb0e9f8e514a2e589093a2e.png\"\/><figcaption>\u0414\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Python, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438<\/figcaption><\/figure>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u043a\u0430\u043a \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u0412\u0441\u044f\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>yield<\/code>, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c. \u0412\u044b\u0437\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u0438&#187; \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (<a href=\"https:\/\/docs.python.org\/3\/glossary.html#term-generator-iterator\" rel=\"noopener noreferrer nofollow\">generator iterator<\/a>). (\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441 <code>yield<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430.) \u0412 \u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432\u0441\u044f\u043a\u0438\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>next()<\/code> (\u0438\u043b\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 for-in, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>next()<\/code> \u043d\u0435\u044f\u0432\u043d\u043e). \u0410 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>yield<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043f\u043e\u0434\u043e\u0431\u043d\u043e <code>return<\/code>, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. (\u0427\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>return<\/code>.)<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u043e\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <code>yield<\/code> \u0438 <code>next()<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0445 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b\u043c\u0438 \u043e\u0442 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u043d\u0438 \u0438 \u0435\u0441\u0442\u044c. \u041d\u043e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434. \u041d\u0443\u0436\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u0431\u0443\u0434\u0435\u0442 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0445 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c. \u0421\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>next()<\/code>, \u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u2014 \u0441 <code>yield<\/code>. C \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c <code>yield<\/code>, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u043e\u0432\u044c \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0418 \u0442\u0430\u043a \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043f\u043e\u043c\u043d\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432<\/a>. \u041e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e \u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043e\u043d \u0433\u043e\u0442\u043e\u0432. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043e\u043b\u0431\u0435\u043a\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0438, \u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u0439.<\/p>\n<p>\u041d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0441\u0432\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0440\u0435\u0448\u0430\u044e\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c yield \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0432 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0441 \u043a\u0430\u043a\u0438\u043c \u0441\u043e\u043a\u0435\u0442\u043e\u043c \u0441\u0432\u044f\u0437\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043a\u0435\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432 (\u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432), \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f. <\/p>\n<h2>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e<\/a> \u0441\u043e\u043a\u0435\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0438 <code>yield<\/code>, \u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0430 (<code>callback(sel, key.fileobj, mask)<\/code>) \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (<code>next(_current_gen)<\/code>).<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043a\u043e\u043b\u0431\u0435\u043a\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0438\u0445 <code>yield<\/code>: <\/p>\n<pre><code class=\"python\">_selector = selectors.DefaultSelector()  def wait_for(fileobj):     _selector.register(fileobj, selectors.EVENT_READ, _current_gen)  def main(host, port):     # ...     wait_for(serv_sock)     yield  # same as: yield wait_for(serv_sock)     sock, addr = serv_sock.accept()     # ...  def handle_connection(sock, addr):     # ...     yield wait_for(sock)     data = sock.recv(1024)     # ...<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>sock.accept()<\/code> \u0438\u043b\u0438 <code>sock.recv()<\/code>, \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>wait_for()<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u0432 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0435 (\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u2014 <code>selectors.EVENT_READ<\/code>), \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>data<\/code> \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440-\u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 (<code>loop()<\/code>):<\/p>\n<pre><code class=\"python\">def loop(main_gen):     # ...     while True:         # ...         events = _selector.select()         for key, mask in events:             # Unregister socket registered in wait_for()             _selector.unregister(key.fileobj)             # Continue coroutine             _current_gen = key.data             try:                 next(_current_gen)             except StopIteration:                 # Generator returns, not yields (on disconnect)                 pass<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>selector.select()<\/code>, \u0442\u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>SelectorKey<\/code>, \u0432 \u043f\u043e\u043b\u0435 <code>fileobj<\/code> \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442. \u0410 \u0432 \u043f\u043e\u043b\u0435 <code>data<\/code> \u043c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0435\u0442\u0430. \u041f\u043e\u0441\u043b\u0435 \u0435\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>yield<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043b\u0438 <code>serv_sock.accept()<\/code>, \u0438\u043b\u0438 <code>sock.recv()<\/code>. \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 100 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"python\">import selectors import socket from inspect import isgenerator  # Loop  _ready = [] _current_gen = None _selector = selectors.DefaultSelector()  def loop(main_gen):     # global _ready, _selector     assert isgenerator(main_gen)     create_task(main_gen)     while True:         # Ready tasks         while _ready:             print(f\"(Run task {_ready[0]}...)\")             _run(_ready.pop(0))          # Ready IO         print(\"Waiting for connections or data...\")         events = _selector.select()         for key, mask in events:             _selector.unregister(key.fileobj)             gen = key.data             _run(gen)  def create_task(gen):     # global _ready     assert isgenerator(gen)     print(f\"(Create task {gen}...)\")     _ready.append(gen)  def _run(gen):     global _current_gen     _current_gen = gen     try:         next(gen)     except StopIteration:         # Generator returns, not yields (on disconnect)         pass  def wait_for(fileobj):     # global _current_gen, _selector     _selector.register(fileobj, selectors.EVENT_READ, _current_gen)  # Server  def main(host, port):     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv_sock:         serv_sock.bind((host, port))         serv_sock.listen(1)         # serv_sock.setblocking(False)         print(\"Server started\")          while True:             wait_for(serv_sock)             yield             sock, addr = serv_sock.accept()  # Should be ready after wait_for()             print(\"Connected by\", addr)             create_task(handle_connection(sock, addr))  def handle_connection(sock, addr):     while True:         # Receive         try:             yield wait_for(sock)             data = sock.recv(1024)  # Should be ready after wait_for()         except ConnectionError:             print(f\"Client suddenly closed while receiving\")             break         print(f\"Received {data} from: {addr}\")         if not data:             break         # Process         if data == b\"close\":             break         data = data.upper()         # Send         print(f\"Send: {data} to: {addr}\")         try:             sock.send(data)  # Hope it won't block         except ConnectionError:             print(f\"Client suddenly closed, cannot send\")             break     sock.close()     print(\"Disconnected by\", addr)  HOST = \"\"  # Symbolic name meaning all available interfaces PORT = 50007  # Arbitrary non-privileged port  if __name__ == \"__main__\":     loop(main(HOST, PORT))<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. \u041e\u043d\u0430 \u043b\u0443\u0447\u0448\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438 \u0447\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a <code>yield<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442; \u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>return<\/code>; <\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u043a\u043e\u043b\u0431\u0435\u043a, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0435 \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u0430\u043a <em>callback hell<\/em>; \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0442\u044f\u0436\u0435\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c; \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>yield<\/code> (\u043f\u043e\u0437\u0436\u0435 \u043e\u043d \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0443\u0442 <code>await<\/code>); <\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445; \u043a\u043e\u043b\u0431\u0435\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0434\u0432\u0438\u0436\u043e\u043a, \u0433\u0434\u0435 \u043c\u044b \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0436\u0435 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445. \u0412 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u2014 \u043c\u043e\u0434\u0443\u043b\u044f <code>asyncio<\/code>, \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u0435\u0441\u0442\u043d\u044b\u0439 <code>await<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>yield<\/code>.<\/p>\n<p>\u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0432\u0441\u044e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u043e\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 Python. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438.<\/p>\n<h2>\u041c\u0438\u043c\u0438\u043a\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 asyncio<\/h2>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043a\u043e\u0434 \u0432 \u0442\u043e\u0442 \u0432\u0438\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <code>asyncio<\/code>. \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0442\u0430\u043c. \u0418\u043c\u0435\u044f \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e asyncio \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0435\u0439, \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. (\u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c (<code>selectors.EVENT_WRITE<\/code>). \u0411\u0435\u0437 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u043e\u043a\u0435\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c.)<\/p>\n<pre><code class=\"python\">def run(main):     loop = get_event_loop()     loop.run_forever(main)  loop = None  def get_event_loop():     global loop     if not loop:         loop = SelectorLoop()     return loop  class SelectorLoop:     def __init__(self) -> None:         super().__init__()         self._selector = selectors.DefaultSelector()         self._current_gen = None  # Currently executing generator         self._ready = []         self._run_forever_gen = None      def run_forever(self, main_gen):         self.create_task(main_gen)         while True:  # Main loop             self._run_once()      def create_task(self, gen):         self._ready.append(gen)      def wait_for(self, fileobj):         self._selector.register(fileobj, selectors.EVENT_READ, self._current_gen)         yield  # Yield back to main loop to select other ready I\/O objects      def _run_once(self):         self._process_tasks(self._ready)         print(\"Waiting for connections or data...\")         events = self._selector.select()         self._process_events(events)      def _process_tasks(self, tasks):         while tasks:             self._run(tasks.pop(0))      def _process_events(self, events):         for key, mask in events:             self._selector.unregister(key.fileobj)             gen = key.data             self._run(gen)      def _run(self, gen):         self._current_gen = gen  # Used as callback if wait_for() called during \"next(gen)\"         try:             next(gen)         except StopIteration:  # Disconnected (returned, not yielded)             pass      def sock_accept(self, serv_sock):         try:             sock, addr = serv_sock.accept()  # Try             sock.setblocking(False)             return sock, addr         except (BlockingIOError, InterruptedError):             yield from self.wait_for(serv_sock)  # Go back to main loop until ready             return (yield from self.sock_accept(serv_sock))  # Try again      def sock_recv(self, sock, nbytes):         try:             return sock.recv(nbytes)  # Try         except (BlockingIOError, InterruptedError):             yield from self.wait_for(sock)  # Go back to main loop until ready             return (yield from self.sock_recv(sock, nbytes))  # Try again      def sock_sendall(self, sock, data):         sock.send(data)  def main(host, port):     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv_sock:         serv_sock.bind((host, port))         serv_sock.listen(1)         # sock.setblocking(False)         loop = get_event_loop()         while True:             sock, addr = yield from loop.sock_accept(serv_sock)             loop.create_task(handle_connection(sock, addr))  def handle_connection(sock, addr):     print(\"Connected by\", addr)     while True:         try:             data = yield from loop.sock_recv(sock, 1024)         except ConnectionError:             print(f\"Client suddenly closed while receiving\")             break         print(f\"Received {data} from: {addr}\")         if not data:             break  # EOF - closed by client         data = data.upper()         print(f\"Send: {data} to: {addr}\")         try:             loop.sock_sendall(sock, data)  # Hope it won't block         except ConnectionError:             print(f\"Client suddenly closed, cannot send\")             break     sock.close()     print(\"Disconnected by\", addr)  HOST, PORT = \"\", 50007  if __name__ == \"__main__\":     run(main(HOST, PORT))<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c <code>wait_for()<\/code> \u0432\u043d\u0443\u0442\u0440\u044c <code>sock_accept()<\/code> \u0438 <code>sock_recv()<\/code>. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u044b \u0441\u043a\u0440\u043e\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>SelectorLoop<\/code> \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c (<code>loop.sock_accept()<\/code> \u0438\u043b\u0438 <code>loop.sock_recv()<\/code>) \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>yield loop.wait_for()<\/code>. \u0422\u0430\u043c, \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>accept()<\/code> \u0438\u043b\u0438 <code>recv()<\/code> \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u0438 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f (<code>yield<\/code>) \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043a\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438: <\/p>\n<pre><code class=\"python\">class SelectorLoop:     # ...     def sock_accept(self, serv_sock):         try:             sock, addr = serv_sock.accept()             sock.setblocking(False)             return sock, addr         except (BlockingIOError, InterruptedError):             yield from self.wait_for(serv_sock)             return (yield from self.sock_accept(serv_sock))      def sock_recv(self, sock, nbytes):         try:             return sock.recv(nbytes)         except (BlockingIOError, InterruptedError):             yield from self.wait_for(sock)             return (yield from self.sock_recv(sock, nbytes))  def main(host, port):     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv_sock:         serv_sock.bind((host, port))         serv_sock.listen(1)         serv_sock.setblocking(False)         print(\"Server started\")          loop = get_event_loop()         while True:             sock, addr = yield from loop.sock_accept(serv_sock)             loop.create_task(handle_connection(sock, addr))  def handle_connection(sock, addr):     while True:         # ...         data = yield from loop.sock_recv(sock, 1024)         # ...<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0443\u0442 \u043d\u0430\u043c \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0438 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <code>yield from<\/code> \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/post\/676136\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u041c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0438\u0437 <code>gen1<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>yield from gen2<\/code>, \u0442\u043e \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>gen1.gi_yieldfrom<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>gen2<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0432 <code>gen2<\/code> \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d <code>yield from gen3<\/code>, \u0442\u043e <code>gen2.gi_yieldfrom=gen3<\/code> \u0438 <code>gen1.gi_yieldfrom.gi_yieldfrom=gen3<\/code>. \u0418 \u0442\u0430\u043a \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 <code>gen1<\/code> \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e\u0442 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u2014 <code>next(gen1)<\/code> \u2014 \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>gi_yieldfrom<\/code> \u0432\u043e \u0432\u0441\u0435\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0441 <code>gen3<\/code> (<code>gen1.gi_yieldfrom.gi_yieldfrom<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>gen1.gi_yieldfrom.gi_yieldfrom.gi_yieldfrom is None<\/code>). <\/p>\n<p>\u0422\u0430\u043a \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0435 Python \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>next()<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438 \u0432\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u044f\u0437\u044b\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>yield from<\/code> \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>gi_yieldfrom<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0435\u0441\u0442\u0430, \u0441 \u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u043b\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 (<code>gen1<\/code>), \u0430 \u043e\u0431\u043e \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u0441\u0430\u043c Python.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a asyncio<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u0434\u0432\u0438\u0436\u043e\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0441\u0442\u0430\u043b \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c \u043e\u0442 <code>asyncio<\/code>. \u0418 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>main()<\/code> \u0438 <code>handle_connection()<\/code> \u0431\u0443\u0434\u0443\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f asyncio (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 <code>@asyncio.coroutine<\/code>, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435). \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>asyncio<\/code>:<\/p>\n<pre><code class=\"python\">@asyncio.coroutine def main(host, port):     # ...     sock, addr = yield from loop.sock_accept(serv_sock)     # ...  @asyncio.coroutine def handle_connection(sock, addr):     # ...     data = yield from loop.sock_recv(sock, 1024)     # ...     yield from loop.sock_sendall(sock, data)     # ...  HOST, PORT = \"\", 50007  if __name__ == \"__main__\":     asyncio.run(main(HOST, PORT))<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, <code>asyncio<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c (<code>selectors.EVENT_WRITE<\/code>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>loop.sock_sendall()<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>yield from<\/code>. \u0415\u0449\u0435, \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c <code>asyncio<\/code> \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (coroutine) \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0432 <code>asyncio<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 <code>@asyncio.coroutine<\/code>, \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433, \u0447\u0442\u043e \u043e\u043d \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>inspect.iscoroutine()<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u0442\u043d\u044b\u043d\u0435 <code>True<\/code>, \u0430 <code>inspect.isgenerator()<\/code> \u2014 <code>False<\/code>. \u0415\u0449\u0435 \u0441 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e <code>yield from<\/code>, \u043d\u043e \u043d\u0435 <code>yield<\/code>. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e \u0438 \u0432\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u0432 Python. \u041d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435.<\/p>\n<h2>\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a async-await<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u2014 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0441 <code>@asyncio.coroutine<\/code> \u043d\u0430 <code>async<\/code>, \u0430 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 <code>yield from<\/code> \u043d\u0430 <code>await<\/code>. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438, \u043d\u043e \u0438 \u043d\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c\u0438. \u041e\u043d\u0438 \u0435\u0449\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0431\u0435 \u043f\u0435\u0447\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 (<code>yield<\/code>), \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c, \u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u043d\u0438\u043a\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0432\u0441\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432 Python, \u043d\u0435 \u044f\u0441\u043d\u043e, \u043a\u0430\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>yield from<\/code>.<\/p>\n<pre><code class=\"python\">async def main(host, port):     # ...     sock, addr = await loop.sock_accept(serv_sock)     # ...  async def handle_connection(sock, addr):     # ...     data = await loop.sock_recv(sock, 1024)     # ...     await loop.sock_sendall(sock, data)     # ...  HOST, PORT = \"\", 50007  if __name__ == \"__main__\":     asyncio.run(main(HOST, PORT))<\/code><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 <code>async<\/code> \u0438 <code>await<\/code> \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 <code>coroutine<\/code> \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>yield from<\/code>. \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0442\u044c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0445\u043e\u0442\u044c \u0435\u0433\u043e \u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c.<\/p>\n<h2>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/h2>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>TCPServer<\/code>, <code>ForkingTCPServer<\/code> \u0438 <a href=\"https:\/\/habr.com\/ru\/post\/676118\/\" rel=\"noopener noreferrer nofollow\">ThreadingTCPServer<\/a>, \u0432 asyncio \u0446\u0438\u043a\u043b \u043f\u0440\u0438\u0435\u043c\u0430 \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 (<code>main()<\/code>) \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u2014 \u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 <code>asyncio.start_server()<\/code>. \u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e (\u0432 <code>handle_connection()<\/code>) \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438: <code>StreamReader<\/code> \u0438 <code>StreamWriter<\/code>. \u041e\u043d\u0438 \u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>(read()<\/code>, <code>write()<\/code>).<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043e\u0431\u0435\u0440\u0442\u043e\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043d\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0438 \u0434\u043b\u044f \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u0438 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>StreamReader<\/code> \u0438 <code>StreamWriter<\/code>. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442.<\/p>\n<pre><code class=\"python\">import asyncio  async def handle_connection(reader, writer):     addr = writer.get_extra_info(\"peername\")     print(\"Connected by\", addr)     while True:         # Receive         try:             data = await reader.read(1024)         except ConnectionError:             print(f\"Client suddenly closed while receiving from {addr}\")             break         if not data:             break         data = data.upper()         try:             writer.write(data)         except ConnectionError:             print(f\"Client suddenly closed, cannot send\")             break     writer.close()     print(\"Disconnected by\", addr)  async def main(host, port):     server = await asyncio.start_server(handle_connection, host, port)     async with server:         await server.serve_forever()  HOST, PORT = \"\", 50007  if __name__ == \"__main__\":     asyncio.run(main(HOST, PORT))<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>with<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 <code>__enter__()<\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442, \u0438 <code>__exit__()<\/code> \u2014 \u0432 \u043a\u043e\u043d\u0446\u0435 \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0432 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>await<\/code>), \u0431\u044b\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0438: <code>__aenter__()<\/code> \u0438 <code>__aexit__()<\/code>. \u0414\u043b\u044f \u043d\u0438\u0445 \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f <code>with<\/code> \u2014 <code>async with<\/code>.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <code>asyncio<\/code> \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430 <code>with<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>__exit__()<\/code> \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d <code>await<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u043c\u0435\u0441\u0442\u043e <code>with<\/code> \u0438 <code>__exit__()<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438:<\/p>\n<pre><code class=\"python\">async def main(host, port):     # (asyncio.start_server() returns one of the implementations of AbstractServer)     server = await asyncio.start_server(handle_connection, host, port)     async with server:         await server.serve_forever()  class AbstractServer:     # ...     async def __aexit__(self, *exc):         self.close()         await self.wait_closed()<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0438 \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043e\u043a\u0435\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 Python. \u041c\u044b \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0441\u0430\u043c\u044b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438, \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0438 \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u043d\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u2014 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u2014 \u0447\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p><a href=\"https:\/\/gitlab.com\/markelov-alex\/hx-py-framework-evolution\/-\/tree\/main\/f_models\/server_socket\/v0\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a> <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/676136\/\" rel=\"noopener noreferrer nofollow\">&lt; \u041d\u0430\u0437\u0430\u0434<\/a>  |\u00a0 <a href=\"https:\/\/habr.com\/ru\/post\/676110\/\" rel=\"noopener noreferrer nofollow\">\u041d\u0430\u0447\u0430\u043b\u043e<\/a><\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/tproger.ru\/articles\/asynchronous-programming\/\" rel=\"noopener noreferrer nofollow\">\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/realpython.com\/async-io-python\/\" rel=\"noopener noreferrer nofollow\">Async IO in Python: A Complete Walkthrough<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/676144\/\"> https:\/\/habr.com\/ru\/post\/676144\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/676136\/\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0448\u0435<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043a\u0430\u043a \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u043e\u043b\u0438 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0415\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u043d\u044c\u0448\u0435<\/a> \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f <code>selectors<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043e\u0431\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 (coroutines).<\/p>\n<figure class=\"\"><figcaption>\u0414\u0432\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u0432 Python, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438<\/figcaption><\/figure>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u043a\u0430\u043a \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u0412\u0441\u044f\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>yield<\/code>, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c. \u0412\u044b\u0437\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u0438&#187; \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (<a href=\"https:\/\/docs.python.org\/3\/glossary.html#term-generator-iterator\" rel=\"noopener noreferrer nofollow\">generator iterator<\/a>). (\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441 <code>yield<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430.) \u0412 \u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0432\u0441\u044f\u043a\u0438\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>next()<\/code> (\u0438\u043b\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435 for-in, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>next()<\/code> \u043d\u0435\u044f\u0432\u043d\u043e). \u0410 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>yield<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043f\u043e\u0434\u043e\u0431\u043d\u043e <code>return<\/code>, \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. (\u0427\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>return<\/code>.)<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u043e\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <code>yield<\/code> \u0438 <code>next()<\/code> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0445 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b\u043c\u0438 \u043e\u0442 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043e\u043d\u0438 \u0438 \u0435\u0441\u0442\u044c. \u041d\u043e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u0438 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434. \u041d\u0443\u0436\u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u0431\u0443\u0434\u0435\u0442 \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0445 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c. \u0421\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>next()<\/code>, \u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u2014 \u0441 <code>yield<\/code>. C \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c <code>yield<\/code>, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043d\u043e\u0432\u044c \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0418 \u0442\u0430\u043a \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043f\u043e\u043c\u043d\u0438\u043c \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432<\/a>. \u041e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u0435\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e \u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043e\u043d \u0433\u043e\u0442\u043e\u0432. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043e\u043b\u0431\u0435\u043a\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u043a\u0435\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0438, \u0442\u043e \u043e\u043d\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u0439.<\/p>\n<p>\u041d\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0441\u0432\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0440\u0435\u0448\u0430\u044e\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c yield \u0438 \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430, \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0432 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0441 \u043a\u0430\u043a\u0438\u043c \u0441\u043e\u043a\u0435\u0442\u043e\u043c \u0441\u0432\u044f\u0437\u0430\u043d \u0434\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u043a\u0435\u0442 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432 (\u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432), \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f. <\/p>\n<h2>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/676124\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e<\/a> \u0441\u043e\u043a\u0435\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0438 <code>yield<\/code>, \u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0430 (<code>callback(sel, key.fileobj, mask)<\/code>) \u0437\u0430\u043c\u0435\u043d\u0438\u043c \u043d\u0430 \u0438\u0442\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 (<code>next(_current_gen)<\/code>).<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043a\u043e\u043b\u0431\u0435\u043a\u0438 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0438\u0445 <code>yield<\/code>: <\/p>\n<pre><code class=\"python\">_selector = selectors.DefaultSelector()  def wait_for(fileobj):     _selector.register(fileobj, selectors.EVENT_READ, _current_gen)  def main(host, port):     # ...     wait_for(serv_sock)     yield  # same as: yield wait_for(serv_sock)     sock, addr = serv_sock.accept()     # ...  def handle_connection(sock, addr):     # ...     yield wait_for(sock)     data = sock.recv(1024)     # ...<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>sock.accept()<\/code> \u0438\u043b\u0438 <code>sock.recv()<\/code>, \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>wait_for()<\/code> \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u0432 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0435 (\u043d\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u2014 <code>selectors.EVENT_READ<\/code>), \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <code>data<\/code> \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440-\u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>yield<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 (<code>loop()<\/code>):<\/p>\n<pre><code class=\"python\">def loop(main_gen):     # ...     while True:         # ...         events = _selector.select()         for key, mask in events:             # Unregister socket registered in wait_for()             _selector.unregister(key.fileobj)             # Continue coroutine             _current_gen = key.data             try:                 next(_current_gen)             except StopIteration:                 # Generator returns, not yields (on disconnect)                 pass<\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>selector.select()<\/code>, \u0442\u043e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>SelectorKey<\/code>, \u0432 \u043f\u043e\u043b\u0435 <code>fileobj<\/code> \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442. \u0410 \u0432 \u043f\u043e\u043b\u0435 <code>data<\/code> \u043c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0435\u0442\u0430. \u041f\u043e\u0441\u043b\u0435 \u0435\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0441\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>yield<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043b\u0438 <code>serv_sock.accept()<\/code>, \u0438\u043b\u0438 <code>sock.recv()<\/code>. \u0421\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 100 \u0441\u0442\u0440\u043e\u043a:<\/p>\n<pre><code class=\"python\">import selectors import socket from inspect import isgenerator  # Loop  _ready = [] _current_gen = None _selector = selectors.DefaultSelector()  def loop(main_gen):     # global _ready, _selector     assert isgenerator(main_gen)     create_task(main_gen)     while True:         # Ready tasks         while _ready:             print(f\"(Run task {_ready[0]}...)\")             _run(_ready.pop(0))          # Ready IO         print(\"Waiting for connections or data...\")         events = _selector.select()         for key, mask in events:             _selector.unregister(key.fileobj)             gen = key.data             _run(gen)  def create_task(gen):     # global _ready     assert isgenerator(gen)     print(f\"(Create task {gen}...)\")     _ready.append(gen)  def _run(gen):     global _current_gen     _current_gen = gen     try:         next(gen)     except StopIteration:         # Generator returns, not yields (on disconnect)         pass  def wait_for(fileobj):     # global _current_gen, _selector     _selector.register(fileobj, selectors.EVENT_READ, _current_gen)  # Server  def main(host, port):     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv_sock:         serv_sock.bind((host, port))         serv_sock.listen(1)         # serv_sock.setblocking(False)         print(\"Server started\")          while True:             wait_for(serv_sock)             yield             sock, addr = serv_sock.accept()  # Should be ready after wait_for()             print(\"Connected by\", addr)             create_task(handle_connection(sock, addr))  def handle_connection(sock, addr):     while True:         # Receive         try:             yield wait_for(sock)             data = sock.recv(1024)  # Should be ready after wait_for()         except ConnectionError:             print(f\"Client suddenly closed while receiving\")             break         print(f\"Received {data} from: {addr}\")         if not data:             break         # Process         if data == b\"close\":             break         data = data.upper()         # Send         print(f\"Send: {data} to: {addr}\")         try:             sock.send(data)  # Hope it won't block         except ConnectionError:             print(f\"Client suddenly closed, cannot send\")             break     sock.close()     print(\"Disconnected by\", addr)  HOST = \"\"  # Symbolic name meaning all available interfaces PORT = 50007  # Arbitrary non-privileged port  if __name__ == \"__main__\":     loop(main(HOST, PORT))<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. \u041e\u043d\u0430 \u043b\u0443\u0447\u0448\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u0440\u0438 \u0447\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a <code>yield<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0438 \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442; \u0432 \u043a\u043e\u043b\u0431\u0435\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>return<\/code>; <\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043d\u0443\u0436\u0435\u043d \u0441\u0432\u043e\u0439 \u043a\u043e\u043b\u0431\u0435\u043a, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043d\u0435\u0440\u0430\u0437\u0431\u0435\u0440\u0438\u0445\u0435 \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u0430\u043a <em>callback hell<\/em>; \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0442\u044f\u0436\u0435\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c; \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f <code>yield<\/code> (\u043f\u043e\u0437\u0436\u0435 \u043e\u043d \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0443\u0442 <code>await<\/code>); <\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445; \u043a\u043e\u043b\u0431\u0435\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 \u0434\u0432\u0438\u0436\u043e\u043a, \u0433\u0434\u0435 \u043c\u044b \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0423\u0436\u0435 \u044d\u0442\u0438\u0445 \u0442\u0440\u0435\u0445 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u043a\u043e\u043b\u0431\u0435\u043a\u0430\u0445. \u0412 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u2014 \u043c\u043e\u0434\u0443\u043b\u044f <code>asyncio<\/code>, \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u0435\u0441\u0442\u043d\u044b\u0439 <code>await<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>yield<\/code>.<\/p>\n<p>\u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0432\u0441\u044e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u0430\u043a \u043e\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 Python. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438.<\/p>\n<h2>\u041c\u0438\u043c\u0438\u043a\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 asyncio<\/h2>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0443\u0436\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u043a\u043e\u0434 \u0432 \u0442\u043e\u0442 \u0432\u0438\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <code>asyncio<\/code>. \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435, \u043a\u0430\u043a \u0442\u0430\u043c. \u0418\u043c\u0435\u044f \u043f\u0435\u0440\u0435\u0434 \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e asyncio \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0435\u0439, \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. (\u041a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c (<code>selectors.EVENT_WRITE<\/code>). \u0411\u0435\u0437 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u043e\u043a\u0435\u0442\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c.)<\/p>\n<pre><code class=\"python\">def run(main):     loop = get_event_loop()     loop.run_forever(main)  loop = None  def get_event_loop():     global loop     if not loop:         loop = SelectorLoop()     return loop  class SelectorLoop:     def __init__(self) -> None:         super().__init__()         self._selector = selectors.DefaultSelector()         self._current_gen = None  # Currently executing generator         self._ready = []         self._run_forever_gen = None      def run_forever(self, main_gen):         self.create_task(main_gen)         while True:  # Main loop             self._run_once()      def create_task(self, gen):         self._ready.append(gen)      def wait_for(self, fileobj):         self._selector.register(fileobj,<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-335611","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335611","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=335611"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/335611\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=335611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=335611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=335611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}