{"id":482679,"date":"2026-06-07T08:07:28","date_gmt":"2026-06-07T08:07:28","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482679"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482679","title":{"rendered":"\u0422\u043e\u043f-10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 Python backend \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u043b\u044f\u0442 \u0434\u0436\u0443\u043d\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0413\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438\u0437 StackOverflow \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0437\u043d\u0430\u044e\u0442 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435. \u0418\u043d\u0442\u0435\u0440\u0432\u044c\u044e\u0435\u0440\u044b \u044d\u0442\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043d\u0430 Python backend \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445, \u0441 \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b\u0438 \u0431\u044b \u0432\u0430\u043c \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 1. \u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u0445<\/h4>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">funcs = [lambda: i for i in range(10)]print(funcs[0]())  # \u0427\u0442\u043e \u0432\u0435\u0440\u043d\u0451\u0442?print(funcs[3]())  # \u0410 \u044d\u0442\u043e?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442: <code>0<\/code> \u0438 <code>3<\/code>. \u041e\u0431\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435. \u041e\u0431\u0430 \u0432\u0435\u0440\u043d\u0443\u0442 <code>9<\/code>.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/strong><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <code>lambda: i<\/code>, Python \u043d\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 <em>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/em> \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>i<\/code> \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u043d \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 <em>\u0441\u0441\u044b\u043b\u043a\u0443<\/em> \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>i<\/code>. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0434\u043d\u0438\u043c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435\u043c (late binding).<\/p>\n<p>\u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 <code>funcs[0]()<\/code>, \u0446\u0438\u043a\u043b \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f, \u0438 <code>i<\/code> \u0440\u0430\u0432\u043d\u043e <code>9<\/code>. \u0412\u0441\u0435 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u044f\u043c\u0431\u0434 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u2014 \u0438 \u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u041a\u0430\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?<\/strong><\/p>\n<p>\u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">funcs = [lambda i=i: i for i in range(10)]print(funcs[0]())  # 0print(funcs[3]())  # 3<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430. \u042d\u0442\u043e \u0438 \u0441\u043f\u0430\u0441\u0430\u0435\u0442.<\/p>\n<p><strong>\u0413\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435?<\/strong> \u0412 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u0432\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u043e\u0443\u0442\u044b, \u043a\u043e\u043b\u0431\u044d\u043a\u0438. \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0442\u0438\u0445\u0438\u0445 \u0438 \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 2. GIL \u2014 \u0432\u0440\u0430\u0433 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433?<\/h4>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 GIL?<\/strong><\/p>\n<p>GIL (Global Interpreter Lock) \u2014 \u044d\u0442\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Python-\u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 16 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u2014 Python-\u043a\u043e\u0434 \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0430 CPU-\u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435?<\/strong><\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435: \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u2014 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u043e \u043d\u0435\u0442:<\/p>\n<pre><code class=\"python\">import threadingimport timedef count(n):    while n &gt; 0:        n -= 1# \u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043astart = time.time()count(50_000_000)print(f\"\u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a: {time.time() - start:.2f}s\")# \u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430start = time.time()t1 = threading.Thread(target=count, args=(25_000_000,))t2 = threading.Thread(target=count, args=(25_000_000,))t1.start(); t2.start()t1.join(); t2.join()print(f\"\u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430: {time.time() - start:.2f}s\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f <em>\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/em> \u043e\u0434\u043d\u043e\u0433\u043e. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0431\u043e\u0440\u044e\u0442\u0441\u044f \u0437\u0430 GIL, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f, \u0442\u0440\u0430\u0442\u044f\u0442 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u2014 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0434\u0435\u043b\u043e.<\/p>\n<p><strong>\u0422\u043e\u0433\u0434\u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 threading?<\/strong><\/p>\n<p>GIL \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f I\/O \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u043e\u043d \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u0442 GIL, \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 threading \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f I\/O-bound \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430:<\/strong><\/p>\n<ul>\n<li>\n<p>CPU-bound (\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445) \u2192 <code>multiprocessing<\/code><\/p>\n<\/li>\n<li>\n<p>I\/O-bound (HTTP, \u0411\u0414, \u0444\u0430\u0439\u043b\u044b) \u2192 <code>threading<\/code> \u0438\u043b\u0438 <code>asyncio<\/code><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442?<\/strong> \u0412 Python 3.13 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c &#171;no-GIL&#187;. \u042d\u0442\u043e \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a \u043d\u0435\u043c\u0443 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 3. slots \u2014 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437<\/h4>\n<p><strong>\u041a\u0430\u043a Python \u0445\u0440\u0430\u043d\u0438\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e?<\/strong><\/p>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code><strong>dict<\/strong><\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b:<\/p>\n<pre><code class=\"python\">class User:    def __init__(self, name, age):        self.name = name        self.age = ageu = User(\"Alice\", 30)print(u.__dict__)  # {'name': 'Alice', 'age': 30}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u043e\u0432\u0430\u0440\u044c \u2014 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043d\u043e \u0442\u044f\u0436\u0451\u043b\u0430\u044f. \u041e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u043b\u044e.<\/p>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <\/strong><code><strong>slots<\/strong><\/code><strong>?<\/strong><\/p>\n<p><code><strong>slots<\/strong><\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Python: \u00ab\u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u044d\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u2014 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0439 \u043f\u043e\u0434 \u043d\u0438\u0445 \u043f\u0430\u043c\u044f\u0442\u044c\u00bb. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b:<\/p>\n<pre><code class=\"python\">class UserWithSlots:    __slots__ = ['name', 'age']        def __init__(self, name, age):        self.name = name        self.age = ageu = UserWithSlots(\"Alice\", 30)# u.__dict__  \u2192 AttributeError! \u0421\u043b\u043e\u0432\u0430\u0440\u044f \u043d\u0435\u0442.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e?<\/strong><\/p>\n<pre><code class=\"python\">import sysu1 = User(\"Alice\", 30)u2 = UserWithSlots(\"Alice\", 30)print(sys.getsizeof(u1))  # ~48 \u0431\u0430\u0439\u0442 + \u0441\u043b\u043e\u0432\u0430\u0440\u044c ~232 \u0431\u0430\u0439\u0442 = ~280 \u0431\u0430\u0439\u0442print(sys.getsizeof(u2))  # ~56 \u0431\u0430\u0439\u0442 \u2014 \u0432\u0441\u0451!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 ~5x \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 280 \u041c\u0411 \u0438 56 \u041c\u0411 \u043e\u0447\u0435\u043d\u044c \u043e\u0449\u0443\u0442\u0438\u043c\u0430.<\/p>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c?<\/strong> \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u0442\u0430\u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\u0445: \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 CSV, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435:<\/strong> \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0441\u043e <code><strong>slots<\/strong><\/code>. \u042d\u0442\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c.<\/p>\n<h3>\u0425\u043e\u0442\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432?<\/h3>\n<p>\u042d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e 10 \u0438\u0437 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u2014 \u0435\u0441\u0442\u044c<strong> \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439<\/strong> \u043a\u0443\u0440\u0441 <a href=\"https:\/\/stepik.org\/252266\" rel=\"noopener noreferrer nofollow\"><strong>\u00ab101 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 | Python\u00bb<\/strong>.<\/a><\/p>\n<p>\u0412 \u043d\u0451\u043c <strong>101<\/strong> \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430. \u041a\u0443\u0440\u0441 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0430\u043c\u044f\u0442\u044c, \u041e\u041e\u041f, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0444\u0430\u0439\u043b\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u2014 \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043e\u0442 Intern \u0434\u043e Junior \u0443\u0440\u043e\u0432\u043d\u044f. \u0411\u0435\u0437 \u0432\u043e\u0434\u044b, \u0431\u0435\u0437 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0441\u0442\u0435\u043d, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 4. asyncio vs threading vs multiprocessing<\/h4>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u2014 \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445, \u0433\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u0434\u0430\u044e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430: \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c 1000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 API. \u0427\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c?<\/p>\n<p><strong>threading<\/strong><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c 1000 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u2014 \u044d\u0442\u043e ~8 \u041c\u0411 \u043f\u0430\u043c\u044f\u0442\u0438. 1000 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 = 8 \u0413\u0411. \u041f\u043b\u044e\u0441 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<pre><code class=\"python\">import threadingimport requestsdef fetch(url):    response = requests.get(url)    return response.json()threads = [threading.Thread(target=fetch, args=(url,)) for url in urls]for t in threads: t.start()for t in threads: t.join()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>asyncio<\/strong><\/p>\n<p>\u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u043e\u0434\u0438\u043d event loop, \u0442\u044b\u0441\u044f\u0447\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d. \u041f\u043e\u043a\u0430 \u043e\u0434\u043d\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 event loop \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u041f\u0430\u043c\u044f\u0442\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u0435\u043d\u044c\u0448\u0435:<\/p>\n<pre><code class=\"python\">import asyncioimport aiohttpasync def fetch(session, url):    async with session.get(url) as response:        return await response.json()async def main():    async with aiohttp.ClientSession() as session:        tasks = [fetch(session, url) for url in urls]        results = await asyncio.gather(*tasks)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>multiprocessing<\/strong><\/p>\n<p>\u041e\u0431\u0445\u043e\u0434\u0438\u0442 GIL, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c. \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f CPU-bound \u0437\u0430\u0434\u0430\u0447:<\/p>\n<pre><code class=\"python\">from multiprocessing import Pooldef heavy_computation(data):    # \u0422\u044f\u0436\u0451\u043b\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f    return resultwith Pool(processes=4) as pool:    results = pool.map(heavy_computation, data_list)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430:<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0417\u0430\u0434\u0430\u0447\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">asyncio + aiohttp<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0430\u0440\u0441\u0438\u043d\u0433 HTML (CPU)<\/p>\n<\/td>\n<td>\n<p align=\"left\">multiprocessing<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 legacy-\u043a\u043e\u0434\u043e\u043c \u0431\u0435\u0437 async<\/p>\n<\/td>\n<td>\n<p align=\"left\">threading<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 ML-\u043c\u043e\u0434\u0435\u043b\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">multiprocessing<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 5. \u041f\u043e\u0447\u0435\u043c\u0443 async \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c?<\/h4>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">async def get_data():    return 42result = get_data()print(result)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u0442 <code>print<\/code>? \u041d\u0435 <code>42<\/code>. \u0412\u043e\u0442 \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442:<\/p>\n<pre><code>&lt;coroutine object get_data at 0x7f8b1c2d3e80&gt;RuntimeWarning: coroutine 'get_data' was never awaited<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a?<\/strong><\/p>\n<p><code>async def<\/code> \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u042d\u0442\u043e \u043a\u0430\u043a \u0447\u0435\u0440\u0442\u0451\u0436, \u0430 \u043d\u0435 \u0437\u0434\u0430\u043d\u0438\u0435. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 <em>\u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/em>, \u043d\u043e \u0441\u0430\u043c\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043a\u0442\u043e-\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0435\u0451 \u0432 event loop.<\/p>\n<p><strong>\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443:<\/strong><\/p>\n<pre><code class=\"python\"># 1. await \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438async def main():    result = await get_data()    print(result)  # 42# 2. asyncio.run() \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430asyncio.run(main())# 3. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 event loopasync def main():    task = asyncio.create_task(get_data())    result = await task<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c:<\/strong> <code>await<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>async def<\/code>. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 <code>await<\/code> \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 <code>SyntaxError<\/code>. \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0431\u0438\u0432\u0430\u0435\u0442 \u0441 \u0442\u043e\u043b\u043a\u0443 \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 6. Event loop \u2014 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <code>asyncio<\/code>, \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044f \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/p>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 event loop?<\/strong><\/p>\n<p>Event loop \u2014 \u044d\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0437\u0430\u0434\u0430\u0447:<\/p>\n<pre><code class=\"python\">while True:    events = poll_for_events()    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c: \u0447\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u043e?    for event in events:        run_callback(event)       # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u0434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <\/strong><code><strong>await asyncio.sleep(1)<\/strong><\/code><strong>?<\/strong><\/p>\n<pre><code class=\"python\">async def main():    print(\"\u0421\u0442\u0430\u0440\u0442\")    await asyncio.sleep(1)    print(\"\u041f\u0440\u043e\u0448\u043b\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0428\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <code>print(\"\u0421\u0442\u0430\u0440\u0442\")<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f <code>await asyncio.sleep(1)<\/code> \u2014 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 <strong>\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/strong> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 event loop<\/p>\n<\/li>\n<li>\n<p>Event loop \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<\/p>\n<\/li>\n<li>\n<p>Event loop \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438? \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0445<\/p>\n<\/li>\n<li>\n<p>\u0427\u0435\u0440\u0435\u0437 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, event loop <strong>\u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442<\/strong> \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <code>print(\"\u041f\u0440\u043e\u0448\u043b\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\")<\/code><\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0442\u043e\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041e\u043d \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043b\u0438\u0431\u043e \u0436\u0434\u0451\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u041e\u0421.<\/p>\n<p><strong>\u0412\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443 <\/strong><code><strong>time.sleep()<\/strong><\/code><strong> \u0432 async-\u043a\u043e\u0434\u0435 \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430:<\/strong><\/p>\n<pre><code class=\"python\">async def bad_handler():    time.sleep(5)  # \u0412\u0421\u0415 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442 \u043d\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434!    return {\"status\": \"ok\"}async def good_handler():    await asyncio.sleep(5)  # \u0422\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0436\u0434\u0451\u0442, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442    return {\"status\": \"ok\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>time.sleep()<\/code> \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 <strong>\u043f\u043e\u0442\u043e\u043a<\/strong> \u2014 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0432\u0435\u0441\u044c event loop. <code>asyncio.sleep()<\/code> \u0442\u043e\u043b\u044c\u043a\u043e <\/p>\n<p>\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f event loop \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 7. N+1 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h4>\n<p>\u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430, \u043d\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 SQL.<\/p>\n<p><strong>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:<\/strong><\/p>\n<pre><code class=\"python\">users = User.objects.all()for user in users:    print(user.profile.bio)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0432\u0438\u043d\u043d\u043e. \u041d\u0430 \u0434\u0435\u043b\u0435 \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0430\u0437\u0435:<\/strong><\/p>\n<pre><code class=\"sql\">-- \u0417\u0430\u043f\u0440\u043e\u0441 1: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439SELECT * FROM users;-- \u0417\u0430\u043f\u0440\u043e\u0441 2: \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044fSELECT * FROM profiles WHERE user_id = 1;-- \u0417\u0430\u043f\u0440\u043e\u0441 3: \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044fSELECT * FROM profiles WHERE user_id = 2;-- ... \u0438 \u0442\u0430\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f-- \u0418\u0442\u043e\u0433\u043e: 1 + N \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 = 101 \u0437\u0430\u043f\u0440\u043e\u0441. 1000 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 = 1001 \u0437\u0430\u043f\u0440\u043e\u0441. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 round-trip \u0434\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <\/strong><code><strong>select_related<\/strong><\/code><strong>:<\/strong><\/p>\n<pre><code class=\"python\">users = User.objects.select_related('profile').all()for user in users:    print(user.profile.bio)  # \u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 SQL \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d JOIN:<\/p>\n<pre><code class=\"sql\">SELECT users.*, profiles.*FROM usersLEFT JOIN profiles ON profiles.user_id = users.id;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 <\/strong><code><strong>select_related<\/strong><\/code><strong>, \u0430 \u043a\u043e\u0433\u0434\u0430 <\/strong><code><strong>prefetch_related<\/strong><\/code><strong>?<\/strong><\/p>\n<p><code>select_related<\/code> \u2014 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0435\u0439 ForeignKey \u0438 OneToOne (JOIN \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435).<\/p>\n<p><code>prefetch_related<\/code> \u2014 \u0434\u043b\u044f ManyToMany \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 FK (\u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 + Python-\u0441\u043a\u043b\u0435\u0439\u043a\u0430):<\/p>\n<pre><code class=\"python\"># \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0433\u043e\u0432 \u2014 \u0442\u0443\u0442 \u043d\u0443\u0436\u0435\u043d prefetch_relatedposts = Post.objects.prefetch_related('tags').all()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u0430\u043a \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c N+1 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435?<\/strong> \u041f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 <code>django-debug-toolbar<\/code> \u0438\u043b\u0438 <code>django-silk<\/code> \u2014 \u043e\u043d\u0438 \u043f\u043e\u043a\u0430\u0436\u0443\u0442 \u0432\u0441\u0435 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435. \u0415\u0441\u043b\u0438 \u0432\u0438\u0434\u0438\u0442\u0435 50+ \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u2014 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 N+1.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 8. \u0418\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u043d\u0435 \u0441\u0435\u0440\u0435\u0431\u0440\u044f\u043d\u0430\u044f \u043f\u0443\u043b\u044f<\/h4>\n<p>\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u0436\u0443\u043d\u0430: &#171;\u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0438\u043d\u0434\u0435\u043a\u0441&#187;. \u042d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441?<\/strong><\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u0431\u044b\u0447\u043d\u043e B-tree), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (full table scan) \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430 O(log n).<\/p>\n<p><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451?<\/strong><\/p>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0417\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u044b \u043f\u043b\u0430\u0442\u0438\u0442\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"sql\">-- \u0411\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430:-- INSERT \u2192 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443-- \u0421 5 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438:-- INSERT \u2192 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 + \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c 5 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c INSERT\/UPDATE\/DELETE \u2014 \u043b\u0438\u0448\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u044b.<\/p>\n<p><strong>\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u0441 \u043d\u0438\u0437\u043a\u043e\u0439 \u0441\u0435\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b:<\/strong><\/p>\n<pre><code class=\"sql\">-- \u041f\u043b\u043e\u0445\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441: \u043a\u043e\u043b\u043e\u043d\u043a\u0430 is_active \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e TRUE\/FALSE-- \u0418\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u0439\u0434\u0451\u0442 50% \u0441\u0442\u0440\u043e\u043a \u2014 \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u0441\u0442\u043e\u043bCREATE INDEX idx_is_active ON users(is_active);-- \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441: email \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044fCREATE INDEX idx_email ON users(email);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e: \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0435\u0441\u043b\u0438 \u043e\u043d \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442 80-90% \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p><strong>LIKE \u0441 wildcard \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442:<\/strong><\/p>\n<pre><code class=\"sql\">-- \u0418\u043d\u0434\u0435\u043a\u0441 \u041d\u0415 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:SELECT * FROM users WHERE name LIKE '%alice%';-- \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:SELECT * FROM users WHERE name LIKE 'alice%';<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u2014 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0432\u0430\u0436\u0435\u043d:<\/strong><\/p>\n<pre><code class=\"sql\">CREATE INDEX idx_name_age ON users(name, age);-- \u042d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441:SELECT * FROM users WHERE name = 'Alice' AND age = 30;-- \u042d\u0442\u043e\u0442 \u041d\u0415 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 (\u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u043d\u0435\u0442):SELECT * FROM users WHERE age = 30;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0439\u0442\u0435 \u0441 <code>EXPLAIN ANALYZE<\/code> \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u2014 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 9. Race condition \u043f\u0440\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445<\/h4>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u2014 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u0438 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p><strong>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439:<\/strong><\/p>\n<p>\u041d\u0430 \u0441\u043a\u043b\u0430\u0434\u0435 1 \u0442\u043e\u0432\u0430\u0440. \u0414\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0436\u0430\u043b\u0438 &#171;\u043a\u0443\u043f\u0438\u0442\u044c&#187;. \u041a\u043e\u0434:<\/p>\n<pre><code class=\"python\">def buy_item(item_id, user_id):    item = Item.objects.get(id=item_id)        if item.quantity &gt; 0:        item.quantity -= 1        item.save()        Order.objects.create(user_id=user_id, item_id=item_id)        return \"\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043e\"    else:        return \"\u0422\u043e\u0432\u0430\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/strong><\/p>\n<pre><code>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c A: \u0447\u0438\u0442\u0430\u0435\u0442 quantity = 1 \u2713\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c B: \u0447\u0438\u0442\u0430\u0435\u0442 quantity = 1 \u2713  \u2190 \u043e\u0431\u0430 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043a\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c A: 1 &gt; 0, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 quantity = 0\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c B: 1 &gt; 0, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 quantity = 0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 &#171;\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043e&#187;. \u0422\u043e\u0432\u0430\u0440 \u0443\u0448\u0451\u043b \u0434\u0432\u0430\u0436\u0434\u044b. \u0421\u043a\u043b\u0430\u0434 \u0432 \u043c\u0438\u043d\u0443\u0441\u0435.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 1: <\/strong><code><strong>SELECT FOR UPDATE<\/strong><\/code><strong> (\u043f\u0435\u0441\u0441\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430)<\/strong><\/p>\n<pre><code class=\"python\">from django.db import transactiondef buy_item(item_id, user_id):    with transaction.atomic():        # \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438        item = Item.objects.select_for_update().get(id=item_id)                if item.quantity &gt; 0:            item.quantity -= 1            item.save()            Order.objects.create(user_id=user_id, item_id=item_id)            return \"\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043e\"        return \"\u0422\u043e\u0432\u0430\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c A \u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c B \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0443 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e race condition.<\/p>\n<p><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 2: \u0410\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 UPDATE \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 (\u043e\u043f\u0442\u0438\u043c\u0438\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430)<\/strong><\/p>\n<pre><code class=\"python\">from django.db.models import Fdef buy_item(item_id, user_id):    updated = Item.objects.filter(        id=item_id,        quantity__gt=0  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u2014 \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c    ).update(quantity=F('quantity') - 1)        if updated:        Order.objects.create(user_id=user_id, item_id=item_id)        return \"\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u0443\u043f\u043b\u0435\u043d\u043e\"    return \"\u0422\u043e\u0432\u0430\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0439 SQL <code>UPDATE<\/code> \u2014 \u0431\u0430\u0437\u0430 \u0441\u0430\u043c\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e. \u0412\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u0442 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0435\u0441\u043b\u0438 quantity \u0443\u0436\u0435 0.<\/p>\n<hr\/>\n<h4>\u0412\u043e\u043f\u0440\u043e\u0441 10. Connection pool \u2014 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f?<\/h4>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d connection pool?<\/strong><\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: TCP-handshake, \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0411\u0414. \u041d\u0430 \u044d\u0442\u043e \u0443\u0445\u043e\u0434\u0438\u0442 20-100 \u043c\u0441. Connection pool \u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u0443\u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u0440\u0430\u0437\u0434\u0430\u0451\u0442 \u0438\u0445 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443.<\/p>\n<p><strong>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438?<\/strong><\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435: pool \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 10 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 11-\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<ul>\n<li>\n<p>\u041e\u043d \u0432\u0441\u0442\u0430\u0451\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0436\u0434\u0451\u0442 \u043f\u043e\u043a\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430 <code>timeout<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u2014 \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 <code>QueuePool limit of size X overflow Y reached<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043b\u043e\u0433\u0430\u0445 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 SQLAlchemy:<\/strong><\/p>\n<pre><code class=\"python\">from sqlalchemy import create_engineengine = create_engine(    DATABASE_URL,    pool_size=10,        # \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f    max_overflow=20,     # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438 \u043f\u0438\u043a\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438    pool_timeout=30,     # \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f    pool_recycle=1800,   # \u041f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u044b\u0435 30 \u043c\u0438\u043d    pool_pre_ping=True,  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0422\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/strong> \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u0438\u0434\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0443\u043b\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 <code>pool_size<\/code>. \u041d\u043e \u0443 PostgreSQL \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043b\u0438\u043c\u0438\u0442 \u2014 <code>max_connections<\/code> (\u043e\u0431\u044b\u0447\u043d\u043e 100). \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 5 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 pool_size=25 \u2014 \u0432\u044b \u0443\u0436\u0435 \u043d\u0430 \u043b\u0438\u043c\u0438\u0442\u0435 \u0411\u0414.<\/p>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 PgBouncer:<\/strong><\/p>\n<p>\u041c\u0435\u0436\u0434\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 PostgreSQL \u0441\u0442\u0430\u0432\u044f\u0442 PgBouncer \u2014 \u043f\u0440\u043e\u043a\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0441 \u0411\u0414. \u042d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430.<\/p>\n<pre><code>[App Instance 1] \u2500\u2500\u2510[App Instance 2] \u2500\u2500\u2524\u2500\u2500 [PgBouncer] \u2500\u2500 [PostgreSQL][App Instance 3] \u2500\u2500\u2518  (1000 conn)          (10 conn)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0447\u0430\u0441\u0442\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u0430<\/strong> \u2014 \u0443\u0442\u0435\u0447\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439. \u041a\u043e\u0434 \u0432\u0437\u044f\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0443\u043b\u0430, \u0443\u043f\u0430\u043b \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b:<\/p>\n<pre><code class=\"python\"># \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u2014 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u043d\u0451\u0442\u0441\u044f \u0432 \u043f\u0443\u043b \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435async with db.acquire() as connection:    result = await connection.fetch(query)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1044508\/\">https:\/\/habr.com\/ru\/articles\/1044508\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0413\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0438\u0437 StackOverflow \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0437\u043d\u0430\u044e\u0442 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435. \u0418\u043d\u0442\u0435\u0440\u0432\u044c\u044e\u0435\u0440\u044b \u044d\u0442\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u2014 10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043d\u0430 Python backend \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445, \u0441 \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b\u0438 \u0431\u044b \u0432\u0430\u043c \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438.\u0412\u043e\u043f\u0440\u043e\u0441 1. \u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f\u0445\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:funcs = [lambda: i for i in range(10)]print(funcs[0]())  # \u0427\u0442\u043e \u0432\u0435\u0440\u043d\u0451\u0442?print(funcs[3]())  # \u0410 \u044d\u0442\u043e?\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442: 0 \u0438 3. \u041e\u0431\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435. \u041e\u0431\u0430 \u0432\u0435\u0440\u043d\u0443\u0442 9.\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 lambda: i, Python \u043d\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 i \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u043d \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e i. \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0434\u043d\u0438\u043c \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u0435\u043c (late binding).\u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 funcs[0](), \u0446\u0438\u043a\u043b \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f, \u0438 i \u0440\u0430\u0432\u043d\u043e 9. \u0412\u0441\u0435 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u044f\u043c\u0431\u0434 \u0441\u043c\u043e\u0442\u0440\u044f\u0442 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u2014 \u0438 \u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\u041a\u0430\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c?\u0417\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:funcs = [lambda i=i: i for i in range(10)]print(funcs[0]())  # 0print(funcs[3]())  # 3\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430. \u042d\u0442\u043e \u0438 \u0441\u043f\u0430\u0441\u0430\u0435\u0442.\u0413\u0434\u0435 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u0442 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435? \u0412 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u0432\u044b \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u043e\u0443\u0442\u044b, \u043a\u043e\u043b\u0431\u044d\u043a\u0438. \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0442\u0438\u0445\u0438\u0445 \u0438 \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\u0412\u043e\u043f\u0440\u043e\u0441 2. GIL \u2014 \u0432\u0440\u0430\u0433 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433?\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 GIL?GIL (Global Interpreter Lock) \u2014 \u044d\u0442\u043e \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 Python-\u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u0411\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e: \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 16 \u044f\u0434\u0435\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u2014 Python-\u043a\u043e\u0434 \u0432 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445.\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043d\u0430 CPU-\u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435?\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435: \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u2014 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u043e \u043d\u0435\u0442:import threadingimport timedef count(n):    while n &gt; 0:        n -= 1# \u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043astart = time.time()count(50_000_000)print(f&#187;\u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a: {time.time() &#8212; start:.2f}s&#187;)# \u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430start = time.time()t1 = threading.Thread(target=count, args=(25_000_000,))t2 = threading.Thread(target=count, args=(25_000_000,))t1.start(); t2.start()t1.join(); t2.join()print(f&#187;\u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430: {time.time() &#8212; start:.2f}s&#187;)\u0414\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0431\u043e\u0440\u044e\u0442\u0441\u044f \u0437\u0430 GIL, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f, \u0442\u0440\u0430\u0442\u044f\u0442 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u2014 \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0451 \u0434\u0435\u043b\u043e.\u0422\u043e\u0433\u0434\u0430 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 threading?GIL \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f I\/O \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u043e\u043d \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u0442 GIL, \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 threading \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f I\/O-bound \u0437\u0430\u0434\u0430\u0447.\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430:CPU-bound (\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445) \u2192 multiprocessingI\/O-bound (HTTP, \u0411\u0414, \u0444\u0430\u0439\u043b\u044b) \u2192 threading \u0438\u043b\u0438 asyncio\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442? \u0412 Python 3.13 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c &#171;no-GIL&#187;. \u042d\u0442\u043e \u0434\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043d\u043e \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a \u043d\u0435\u043c\u0443 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.\u0412\u043e\u043f\u0440\u043e\u0441 3. slots \u2014 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u041a\u0430\u043a Python \u0445\u0440\u0430\u043d\u0438\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e?\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c dict, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b:class User:    def __init__(self, name, age):        self.name = name        self.age = ageu = User(&#171;Alice&#187;, 30)print(u.__dict__)  # {&#8216;name&#8217;: &#8216;Alice&#8217;, &#8216;age&#8217;: 30}\u0421\u043b\u043e\u0432\u0430\u0440\u044c \u2014 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043d\u043e \u0442\u044f\u0436\u0451\u043b\u0430\u044f. \u041e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u043b\u044e.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 slots?slots \u0433\u043e\u0432\u043e\u0440\u0438\u0442 Python: \u00ab\u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u044d\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u2014 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0439 \u043f\u043e\u0434 \u043d\u0438\u0445 \u043f\u0430\u043c\u044f\u0442\u044c\u00bb. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b:class UserWithSlots:    __slots__ = [&#8216;name&#8217;, &#8216;age&#8217;]        def __init__(self, name, age):        self.name = name        self.age = ageu = UserWithSlots(&#171;Alice&#187;, 30)# u.__dict__  \u2192 AttributeError! \u0421\u043b\u043e\u0432\u0430\u0440\u044f \u043d\u0435\u0442.\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e?import sysu1 = User(&#171;Alice&#187;, 30)u2 = UserWithSlots(&#171;Alice&#187;, 30)print(sys.getsizeof(u1))  # ~48 \u0431\u0430\u0439\u0442 + \u0441\u043b\u043e\u0432\u0430\u0440\u044c ~232 \u0431\u0430\u0439\u0442 = ~280 \u0431\u0430\u0439\u0442print(sys.getsizeof(u2))  # ~56 \u0431\u0430\u0439\u0442 \u2014 \u0432\u0441\u0451!\u0420\u0430\u0437\u043d\u0438\u0446\u0430 ~5x \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u2014 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 280 \u041c\u0411 \u0438 56 \u041c\u0411 \u043e\u0447\u0435\u043d\u044c \u043e\u0449\u0443\u0442\u0438\u043c\u0430.\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c? \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0430\u0442\u0430\u043a\u043b\u0430\u0441\u0441-\u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\u0445: \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437 CSV, \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438, \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0441\u043e slots. \u042d\u0442\u043e \u0446\u0435\u043d\u0430 \u0437\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c.\u0425\u043e\u0442\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432?\u042d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e 10 \u0438\u0437 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u2014 \u0435\u0441\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 \u00ab101 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 | Python\u00bb.\u0412 \u043d\u0451\u043c 101 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e, \u043a\u0430\u0436\u0434\u044b\u0439 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0440\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430. \u041a\u0443\u0440\u0441 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0430\u043c\u044f\u0442\u044c, \u041e\u041e\u041f, \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0444\u0430\u0439\u043b\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u2014 \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043e\u0442 Intern \u0434\u043e Junior \u0443\u0440\u043e\u0432\u043d\u044f. \u0411\u0435\u0437 \u0432\u043e\u0434\u044b, \u0431\u0435\u0437 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0441\u0442\u0435\u043d, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.\u0412\u043e\u043f\u0440\u043e\u0441 4. asyncio vs threading vs multiprocessing\u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u2014 \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0442\u0435\u0445, \u0433\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u0434\u0430\u044e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.\u0417\u0430\u0434\u0430\u0447\u0430: \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c 1000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 API. \u0427\u0442\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c?threading\u0421\u043e\u0437\u0434\u0430\u0451\u043c 1000 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u2014 \u044d\u0442\u043e ~8 \u041c\u0411 \u043f\u0430\u043c\u044f\u0442\u0438. 1000 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 = 8 \u0413\u0411. \u041f\u043b\u044e\u0441 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.import threadingimport requestsdef fetch(url):    response = requests.get(url)    return response.json()threads = [threading.Thread(target=fetch, args=(url,)) for url in urls]for t in threads: t.start()for t in threads: t.join()asyncio\u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u043e\u0434\u0438\u043d event loop, \u0442\u044b\u0441\u044f\u0447\u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d. \u041f\u043e\u043a\u0430 \u043e\u0434\u043d\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 event loop \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u041f\u0430\u043c\u044f\u0442\u0438 \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u0435\u043d\u044c\u0448\u0435:import asyncioimport aiohttpasync def fetch(session, url):    async with session.get(url) as response:        return await response.json()async def main():    async with aiohttp.ClientSession() as session:        tasks = [fetch(session, url) for url in urls]        results = await asyncio.gather(*tasks)multiprocessing\u041e\u0431\u0445\u043e\u0434\u0438\u0442 GIL, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u2014 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c. \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f CPU-bound \u0437\u0430\u0434\u0430\u0447:from multiprocessing import Pooldef heavy_computation(data):    # \u0422\u044f\u0436\u0451\u043b\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f    return resultwith Pool(processes=4) as pool:    results = pool.map(heavy_computation, data_list)\u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430:\u0417\u0430\u0434\u0430\u0447\u0430\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u04421000 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432asyncio + aiohttp\u041f\u0430\u0440\u0441\u0438\u043d\u0433 HTML (CPU)multiprocessing\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 legacy-\u043a\u043e\u0434\u043e\u043c \u0431\u0435\u0437 asyncthreading\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 ML-\u043c\u043e\u0434\u0435\u043b\u0438multiprocessing\u0412\u043e\u043f\u0440\u043e\u0441 5. \u041f\u043e\u0447\u0435\u043c\u0443 async \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c?\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:async def get_data():    return 42result = get_data()print(result)\u0427\u0442\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u0442 print? \u041d\u0435 42. \u0412\u043e\u0442 \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442:&lt;coroutine object get_data at 0x7f8b1c2d3e80&gt;RuntimeWarning: coroutine &#8216;get_data&#8217; was never awaited\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a?async def \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u2014 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u042d\u0442\u043e \u043a\u0430\u043a \u0447\u0435\u0440\u0442\u0451\u0436, \u0430 \u043d\u0435 \u0437\u0434\u0430\u043d\u0438\u0435. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e \u0441\u0430\u043c\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u043f\u043e\u043a\u0430 \u043a\u0442\u043e-\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0435\u0451 \u0432 event loop.\u0422\u0440\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443:# 1. await \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 async-\u0444\u0443\u043d\u043a\u0446\u0438\u0438async def main():    result = await get_data()    print(result)  # 42# 2. asyncio.run() \u2014 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430asyncio.run(main())# 3. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 event loopasync def main():    task = asyncio.create_task(get_data())    result = await task\u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: await \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 async def. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 await \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 SyntaxError. \u042d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0431\u0438\u0432\u0430\u0435\u0442 \u0441 \u0442\u043e\u043b\u043a\u0443 \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0441 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.\u0412\u043e\u043f\u0440\u043e\u0441 6. Event loop \u2014 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 asyncio, \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044f \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043c\u0435\u0442\u043d\u043e.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 event loop?Event loop \u2014 \u044d\u0442\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0437\u0430\u0434\u0430\u0447:while True:    events = poll_for_events()    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c: \u0447\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u043e?    for event in events:        run_callback(event)       # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043a\u043e\u0434\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 await asyncio.sleep(1)?async def main():    print(&#171;\u0421\u0442\u0430\u0440\u0442&#187;)    await asyncio.sleep(1)    print(&#171;\u041f\u0440\u043e\u0448\u043b\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430&#187;)\u0428\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c:\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f print(&#171;\u0421\u0442\u0430\u0440\u0442&#187;)\u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f await asyncio.sleep(1) \u2014 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 event loopEvent loop \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443Event loop \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438? \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u0445\u0427\u0435\u0440\u0435\u0437 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, event loop \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f print(&#171;\u041f\u0440\u043e\u0448\u043b\u0430 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430&#187;)\u041f\u043e\u0442\u043e\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0438 \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041e\u043d \u043b\u0438\u0431\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043b\u0438\u0431\u043e \u0436\u0434\u0451\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442 \u041e\u0421.\u0412\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443 time.sleep() \u0432 async-\u043a\u043e\u0434\u0435 \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430:async def bad_handler():    time.sleep(5)  # \u0412\u0421\u0415 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442 \u043d\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434!    return {&#171;status&#187;: &#171;ok&#187;}async def good_handler():    await asyncio.sleep(5)  # \u0422\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0436\u0434\u0451\u0442, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442    return {&#171;status&#187;: &#171;ok&#187;}time.sleep() \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u2014 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c \u0432\u0435\u0441\u044c event loop. asyncio.sleep() \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f event loop \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.\u0412\u043e\u043f\u0440\u043e\u0441 7. N+1 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430, \u043d\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0436\u0443\u043d\u043e\u0432 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0435\u0451 \u0447\u0435\u0440\u0435\u0437 SQL.\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434:users = User.objects.all()for user in users:    print(user.profile.bio)\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0432\u0438\u043d\u043d\u043e. \u041d\u0430 \u0434\u0435\u043b\u0435 \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430 \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0431\u0430\u0437\u0435:&#8212; \u0417\u0430\u043f\u0440\u043e\u0441 1: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439SELECT * FROM users;&#8212; \u0417\u0430\u043f\u0440\u043e\u0441 2: \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044fSELECT * FROM profiles WHERE user_id = 1;&#8212; \u0417\u0430\u043f\u0440\u043e\u0441 3: \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044fSELECT * FROM profiles WHERE user_id = 2;&#8212; &#8230; \u0438 \u0442\u0430\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f&#8212; \u0418\u0442\u043e\u0433\u043e: 1 + N \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432100 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 = 101 \u0437\u0430\u043f\u0440\u043e\u0441. 1000 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 = 1001 \u0437\u0430\u043f\u0440\u043e\u0441. \u041a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 round-trip \u0434\u043e \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 select_related:users = User.objects.select_related(&#8216;profile&#8217;).all()for user in users:    print(user.profile.bio)  # \u0414\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b!\u0412 SQL \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d JOIN:SELECT users.*, profiles.*FROM usersLEFT JOIN profiles ON&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482679","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482679","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=482679"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482679\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}