{"id":273265,"date":"2016-01-31T15:20:02","date_gmt":"2016-01-31T12:20:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=273265"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=273265","title":{"rendered":"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f concurrency \u0432 Go \u0441 WebGL"},"content":{"rendered":"<p>       \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 concurrency, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0442\u0440\u0443\u0434\u0435 \u0422\u043e\u043d\u0438 \u0425\u043e\u0430\u0440\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Communicating_sequential_processes\">\u00abCommunicating Sequential Processes\u00bb<\/a>. Go \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 concurrent-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b concurrency \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e?<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c. \u0412\u0441\u0435 \u043c\u044b, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043c\u044b\u0441\u043b\u0438\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u044f \u043f\u043e\u043f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441 \u043e \u0447\u0451\u043c-\u0442\u043e, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u00ab\u043e\u0442 1 \u0434\u043e 100\u00bb, \u0432\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0438\u0445 \u00ab\u0443\u0432\u0438\u0434\u0438\u0442\u0435\u00bb \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u0441\u0435\u0431\u0435 \u0432 \u044d\u0442\u043e\u043c \u043e\u0442\u0447\u0451\u0442. \u042f, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0440\u044f\u0434 \u043e\u0442 1 \u0434\u043e 100 \u0432\u0438\u0436\u0443 \u043a\u0430\u043a \u043b\u0438\u043d\u0438\u044f \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0443\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043e\u0442 \u043c\u0435\u043d\u044f, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0447\u0438\u0441\u043b\u0435 20 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0430\u044f \u0434\u043e 1000+. \u0418, \u043f\u043e\u043a\u043e\u043f\u0430\u0432\u0448\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u044f \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0434\u0435\u0442\u0441\u043a\u043e\u043c \u0441\u0430\u0434\u0443 \u0432 \u0440\u0430\u0437\u0434\u0435\u0432\u0430\u043b\u043a\u0435 \u0432\u0434\u043e\u043b\u044c \u0441\u0442\u0435\u043d\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u043e\u043c\u0435\u0440\u043a\u0438, \u0438 \u0447\u0438\u0441\u043b\u043e 20 \u0431\u044b\u043b\u043e \u043a\u0430\u043a-\u0440\u0430\u0437 \u0432 \u0443\u0433\u043b\u0443. \u0423 \u0432\u0430\u0441 \u0436\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0418\u043b\u0438 \u0432\u043e\u0442, \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u0439 \u0433\u043e\u0434 \u0438 4 \u0441\u0435\u0437\u043e\u043d\u0430 \u0433\u043e\u0434\u0430 \u2014 \u043a\u0442\u043e-\u0442\u043e \u0438\u0445 \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u043a \u043a\u0432\u0430\u0434\u0440\u0430\u0442, \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0430\u043d\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u0437\u043e\u043d\u0443, \u043a\u0442\u043e-\u0442\u043e \u2014 \u043a\u0430\u043a \u043a\u0440\u0443\u0433, \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0451 \u043a\u0430\u043a-\u0442\u043e.<\/p>\n<p>  \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b concurrency \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go \u0438 WebGL. \u042d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0442\u043e, \u043a\u0430\u043a \u044f \u0432\u0438\u0436\u0443 \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/043\/d32\/32d\/043d3232d5ba4217a6e88934b773873d.gif\"\/><br \/>  <a name=\"habracut\"><\/a><br \/>  \u0418\u0442\u0430\u043a, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u2014 \u00abHello, concurrent world\u00bb, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u043c\u043e\u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<h4>\u041f\u0440\u0438\u0432\u0435\u0442, concurrent \u043c\u0438\u0440<\/h4>\n<p>  <\/p>\n<pre><code class=\"go\">package main  func main() {     \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0442\u0438\u043f\u0430 int     ch := make(chan int)      \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443     go func() {         \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c 42 \u0432 \u043a\u0430\u043d\u0430\u043b         ch &lt;- 42     }()     \/\/ \u0436\u0434\u0435\u043c, \u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430     &lt;-ch }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b0f\/1a2\/81c\/b0f1a281c2c04bd0b27c4195c9f321cb.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/hello\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u0417\u0434\u0435\u0441\u044c \u0441\u0438\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0432\u0440\u0435\u043c\u044f \u00ab\u0431\u0435\u0436\u0438\u0442\u00bb \u0432\u043d\u0438\u0437 \u043f\u043e \u043e\u0441\u0438 Y. \u0422\u043e\u043d\u043a\u0438\u0435 \u0441\u0438\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0435 &#8216;main&#8217; \u0438 &#8216;go #19&#8217; \u2014 \u044d\u0442\u043e \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u0435\u0434\u043a\u043e\u0432 \u0438 \u0434\u0435\u0442\u0435\u0439. \u041a\u0440\u0430\u0441\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043e. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 \u043a\u0430\u043d\u0430\u043b\u00bb \u0438 \u00ab\u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430\u00bb \u044d\u0442\u043e \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438, \u043d\u043e \u044f \u0434\u0432\u0430 \u044d\u0442\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u044e \u043a\u0430\u043a \u043e\u0434\u043d\u043e \u2014 \u00ab\u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0443\u00bb. \u0421\u0442\u0440\u043e\u043a\u0430 &quot;#19&quot; \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 ID \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0425\u043e\u0442\u044f \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c ID \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0438 \u043d\u0435\u043b\u044c\u0437\u044f (\u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0434\u0438 \u043d\u0435 \u0433\u043e\u0440\u043e\u0434\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 concurrency, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0433\u0440\u0430\u044e\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c), \u043d\u043e \u0434\u043b\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0445 \u0445\u0430\u043a\u0435\u0440\u0441\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0442\u0430\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u2014 \u043e\u0431 \u044d\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0421\u043a\u043e\u0442\u0430 \u041c\u044d\u043d\u0441\u0444\u0438\u043b\u0434\u0430 <a href=\"http:\/\/blog.sgmansfield.com\/2015\/12\/goroutine-ids\/\">\u00abGoroutine IDs\u00bb<\/a>.<\/p>\n<h4>\u0422\u0430\u0439\u043c\u0435\u0440\u044b<\/h4>\n<p>  \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u0430\u0448 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 Hello, world \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0430. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Go \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u0430\u043a time.After \u0438\u043b\u0438 time.Tick, \u043d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430\u0448 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u2014 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043f\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u0438\u0448\u0435\u0442 \u0432 \u043a\u0430\u043d\u0430\u043b, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c\u0443.  <\/p>\n<pre><code class=\"go\">package main  import &quot;time&quot;  func timer(d time.Duration) &lt;-chan int {     c := make(chan int)     go func() {         time.Sleep(d)         c &lt;- 1     }()     return c }  func main() {     for i := 0; i &lt; 24; i++ {         c := timer(1 * time.Second)         &lt;-c     } }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8e1\/6d2\/f0d\/8e16d2f0d9024394823f776c3acf0155.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/timers\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u0417\u0434\u043e\u0440\u043e\u0432\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \u041d\u043e \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<h4>\u041f\u0438\u043d\u0433-\u043f\u043e\u043d\u0433<\/h4>\n<p>  \u042d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 concurrency \u0431\u044b\u043b \u0432\u0437\u044f\u0442 \u0438\u0437 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0433\u0443\u0433\u043b\u0435\u0440\u0430 Sameer Ajmani &quot;<a href=\"https:\/\/talks.golang.org\/2013\/advconc.slide#1\">Advanced Concurrency Patterns<\/a>&quot;. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c advanced, \u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f \u0441 concurrency \u0432 Go \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043d\u0430\u043b table, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0439 \u0440\u043e\u043b\u044c \u0441\u0442\u043e\u043b\u0430, \u0435\u0441\u0442\u044c \u043c\u044f\u0447 Ball, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f\u0430 int \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0434\u0430\u0440\u043e\u0432 \u043f\u043e \u043d\u0435\u043c\u0443, \u0438 \u0435\u0441\u0442\u044c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b-\u0438\u0433\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u00ab\u0437\u0430\u0431\u0438\u0440\u0430\u044e\u0442 \u043c\u044f\u0447 \u0441\u043e \u0441\u0442\u043e\u043b\u0430\u00bb (\u0447\u0438\u0442\u0430\u044e\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430), \u00ab\u0431\u044c\u044e\u0442 \u043f\u043e \u043d\u0435\u043c\u0443\u00bb (\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e) \u0438 \u00ab\u0431\u0440\u043e\u0441\u0430\u044e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0441\u0442\u043e\u043b\u00bb (\u043f\u0438\u0448\u0443\u0442 \u0432 \u043a\u0430\u043d\u0430\u043b).  <\/p>\n<pre><code class=\"go\">package main  import &quot;time&quot;  func main() {     var Ball int     table := make(chan int)     go player(table)     go player(table)      table &lt;- Ball     time.Sleep(1 * time.Second)     &lt;-table }  func player(table chan int) {     for {         ball := &lt;-table         ball++         time.Sleep(100 * time.Millisecond)         table &lt;- ball     } }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/803\/124\/d08\/803124d0801a444aadd1ef1d0a298a98.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/pingpong\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u044f \u0445\u043e\u0447\u0443 \u0435\u0449\u0451 \u0440\u0430\u0437 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <a href=\"https:\/\/divan.github.io\/demos\/pingpong\/\">\u0441\u0441\u044b\u043b\u043a\u0443 \u0441 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c WebGL \u0434\u0435\u043c\u043e<\/a>, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 \u2014 \u043e\u0442\u043a\u0440\u044b\u0432 \u0432 \u043d\u043e\u0432\u043e\u043c \u0442\u0430\u0431\u0435, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0432\u0438\u0433\u0430\u0442\u044c, \u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\/\u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u0438 3D \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0432\u0430\u043c \u0443\u0433\u043e\u0434\u043d\u043e, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0442\u044c\/\u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0445.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u0440\u0438 \u0438\u0433\u0440\u043e\u043a\u0430-\u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445:  <\/p>\n<pre><code class=\"go\">    go player(table)     go player(table)     go player(table)<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/19b\/e2a\/f64\/19be2af64a0a4f04ae6ec16dce9edad3.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/pingpong3\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u044f\u0447 \u0441\u043e \u0441\u0442\u043e\u043b\u0430 \u043f\u043e-\u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u2014 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a, \u043a\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a?<\/p>\n<p>  \u041e\u0442\u0432\u0435\u0442 \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442 \u2014 \u0440\u0430\u043d\u0442\u0430\u0439\u043c Go \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442<a href=\"https:\/\/github.com\/golang\/go\/blob\/master\/src\/runtime\/chan.go#L34\"> FIFO \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/a> \u0434\u043b\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043c\u044f\u0447\u0430 \u043d\u0430 \u0441\u0442\u043e\u043b. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438 \u0440\u0430\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u041d\u043e \u043f\u043e\u043a\u0430 \u044d\u0442\u043e \u0442\u0430\u043a, \u0438 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0435 \u0442\u0440\u0438, \u0430 \u0441\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d.  <\/p>\n<pre><code class=\"go\">for i := 0; i &lt; 100; i++ {     go player(table) }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/049\/667\/48c\/04966748c1ee4ff7821ada8730a4ebca.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/pingpong100\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041f\u043e\u0440\u044f\u0434\u043e\u043a FIFO \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d, \u043d\u0435 \u0442\u0430\u043a-\u043b\u0438? \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0433\u043e\u0440\u0443\u0442\u0438\u043d (\u043e\u043d\u0438 \u0434\u0435\u0448\u0435\u0432\u044b\u0435, \u0438 \u044d\u0442\u043e \u043e\u043a \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 Go \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0438\u043c\u0435\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0433\u043e\u0440\u0443\u0442\u0438\u043d), \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c.<\/p>\n<h4>Fan-in<\/h4>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u044d\u0442\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <i>fan-in<\/i> \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 <i>fan-out<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0430\u043b\u0435\u0435. \u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e <i>fan-in<\/i> \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0447\u0438\u0442\u0430\u044e\u0449\u0430\u044f \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0432\u0441\u0451 \u0432 \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u0430\u043b.<br \/>  \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443:  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;time&quot; )  func producer(ch chan int, d time.Duration) {     var i int     for {         ch &lt;- i         i++         time.Sleep(d)     } }  func reader(out chan int) {     for x := range out {         fmt.Println(x)     } }  func main() {     ch := make(chan int)     out := make(chan int)     go producer(ch, 100*time.Millisecond)     go producer(ch, 250*time.Millisecond)     go reader(out)     for i := range ch {         out &lt;- i     } }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/735\/259\/737\/735259737f6c4fb6b0298acee046e993.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/fanin\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043f\u0435\u0440\u0432\u044b\u0439 <i>producer<\/i> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 100\u043c\u0441, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u043a\u0430\u0436\u0434\u044b\u0435 250\u043c\u0441, \u0430 <i>reader<\/i> \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u043e\u0442 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435. \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e-\u0441\u0443\u0442\u0438, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 main.<\/p>\n<h4>Fan-out<\/h4>\n<p>  \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e <i>fan-in<\/i> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <i>fan-out<\/i> \u0438\u043b\u0438 <i>workers<\/i> \u043f\u0430\u0442\u0442\u0435\u0440\u043d. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d \u0447\u0438\u0442\u0430\u044e\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430, \u0437\u0430\u0431\u0438\u0440\u0430\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0436\u0434\u0443 \u044f\u0434\u0440\u0430\u043c\u0438 CPU. \u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 &quot;<i>workers<\/i>&quot;. \u0412 Go \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0430\u0447\u043a\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u043a\u0430\u043d\u0430\u043b \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u044d\u0442\u043e\u0442 \u043a\u0430\u043d\u0430\u043b \u0432\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0443 Go.  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot;     &quot;time&quot; )  func worker(tasksCh &lt;-chan int, wg *sync.WaitGroup) {     defer wg.Done()     for {         task, ok := &lt;-tasksCh         if !ok {             return         }         d := time.Duration(task) * time.Millisecond         time.Sleep(d)         fmt.Println(&quot;processing task&quot;, task)     } }  func pool(wg *sync.WaitGroup, workers, tasks int) {     tasksCh := make(chan int)      for i := 0; i &lt; workers; i++ {         go worker(tasksCh, wg)     }      for i := 0; i &lt; tasks; i++ {         tasksCh &lt;- i     }      close(tasksCh) }  func main() {     var wg sync.WaitGroup     wg.Add(36)     go pool(&wg, 36, 50)     wg.Wait() }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ee5\/686\/06c\/ee568606cf9e4940893183a8ad4baef0.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/workers\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041e\u0434\u043d\u0430 \u0432\u0435\u0449\u044c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u0443\u0442 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u2014 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c. \u041b\u0435\u0433\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b-\u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0431\u0435\u0433\u0443\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0437\u0430\u0431\u0438\u0440\u0430\u044f \u0441\u0435\u0431\u0435 \u00ab\u0440\u0430\u0431\u043e\u0442\u0443\u00bb \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c, \u043e\u0434\u043d\u0430 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e, \u0433\u0434\u0435 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 \u0433\u0434\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u0442\u0430\u043a\u0436\u0435 \u0442\u0443\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0443\u0436\u0435 \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043f\u043e\u0440\u043e\u0433\u0443 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0431\u0435\u0433\u0443\u0449\u0435\u0439 \u043d\u0430 4 \u044f\u0434\u0440\u0430\u0445, \u0442\u043e\u0435\u0441\u0442\u044c \u0441 GOMAXPROCS=4. \u0427\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  \u0410 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u0432\u043e\u0440\u043a\u0435\u0440\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438, \u0441\u0430\u0431-\u0432\u043e\u0440\u043a\u0435\u0440\u044b.  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;sync&quot;     &quot;time&quot; )  const (     WORKERS    = 5     SUBWORKERS = 3     TASKS      = 20     SUBTASKS   = 10 )  func subworker(subtasks chan int) {     for {         task, ok := &lt;-subtasks         if !ok {             return         }         time.Sleep(time.Duration(task) * time.Millisecond)         fmt.Println(task)     } }  func worker(tasks &lt;-chan int, wg *sync.WaitGroup) {     defer wg.Done()     for {         task, ok := &lt;-tasks         if !ok {             return         }          subtasks := make(chan int)         for i := 0; i &lt; SUBWORKERS; i++ {             go subworker(subtasks)         }         for i := 0; i &lt; SUBTASKS; i++ {             task1 := task * i             subtasks &lt;- task1         }         close(subtasks)     } }  func main() {     var wg sync.WaitGroup     wg.Add(WORKERS)     tasks := make(chan int)      for i := 0; i &lt; WORKERS; i++ {         go worker(tasks, &wg)     }      for i := 0; i &lt; TASKS; i++ {         tasks &lt;- i     }      close(tasks)     wg.Wait() }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4c6\/c06\/329\/4c6c06329d724e5e8a73fee25164d900.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/workers2\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u0417\u0434\u043e\u0440\u043e\u0432\u043e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432, \u0438 \u0441\u0430\u0431-\u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432, \u043d\u043e \u044f \u0441\u0442\u0440\u0435\u043c\u0438\u043b\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0439.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b, \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441 \u0441\u0430\u0431\u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0430\u0431\u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438, \u0438 \u043a\u0430\u043d\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u043d\u0430\u043b\u0430\u043c, \u043d\u043e \u0438\u0434\u0435\u044f fan-out \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0430.<\/p>\n<h4>\u0421\u0435\u0440\u0432\u0435\u0440\u044b<\/h4>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 fan-out, \u044d\u0442\u043e <i>\u0441\u0435\u0440\u0432\u0435\u0440\u044b<\/i>. \u041e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f. \u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u2014 \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u043f\u043e\u0440\u0442, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u0439\u043c\u0435\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0430 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u043e\u0436\u0438\u0434\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 10K \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"go\">package main  import &quot;net&quot;  func handler(c net.Conn) {     c.Write([]byte(&quot;ok&quot;))     c.Close() }  func main() {     l, err := net.Listen(&quot;tcp&quot;, &quot;:5000&quot;)     if err != nil {         panic(err)     }     for {         c, err := l.Accept()         if err != nil {             continue         }         go handler(c)     } }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/2f1\/27e\/0e6\/2f127e0e6ba8466db99a11b2009ee836.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/servers\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u2014 \u043f\u043e-\u0441\u0443\u0442\u0438, \u0442\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0425\u043e\u0442\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c \u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e \u0441\u043f\u0440\u044f\u0442\u0430\u043d\u0430 \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b. <a href=\"https:\/\/www.youtube.com\/watch?v=rFejpH_tAHM\">\u00ab\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u00bb.<\/a><\/p>\n<p>  \u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440, \u0438, \u0441\u043a\u0430\u0436\u0435\u043c, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0433\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;fmt&quot;     &quot;net&quot;     &quot;time&quot; )  func handler(c net.Conn, ch chan string) {     ch &lt;- c.RemoteAddr().String()     c.Write([]byte(&quot;ok&quot;))     c.Close() }  func logger(ch chan string) {     for {         fmt.Println(&lt;-ch)     } }  func server(l net.Listener, ch chan string) {     for {         c, err := l.Accept()         if err != nil {             continue         }         go handler(c, ch)     } }  func main() {     l, err := net.Listen(&quot;tcp&quot;, &quot;:5000&quot;)     if err != nil {         panic(err)     }     ch := make(chan string)     go logger(ch)     go server(l, ch)     time.Sleep(10 * time.Second) }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c85\/b22\/75a\/c85b2275aa744e1fbabb87d93670954a.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/servers2\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u043d\u0435 \u0442\u0430\u043a \u043b\u0438? \u041d\u0430 \u044d\u0442\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0448 \u043b\u043e\u0433\u0433\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0442\u0438, \u0430 \u043b\u043e\u0433\u0433\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u044b\u043c (\u0441\u043a\u0430\u0436\u0435\u043c, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u0443\u0434\u0430-\u0442\u043e \u0435\u0449\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c). \u041d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043d\u0430\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d <i>fan-out<\/i>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e.<\/p>\n<h4>\u0421\u0435\u0440\u0432\u0435\u0440+\u0412\u043e\u0440\u043a\u0435\u0440<\/h4>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043e\u0437\u0432\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041e\u043d \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445, \u043d\u043e \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0441 \u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 (\u0441\u043a\u0430\u0436\u0435\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441).<br \/>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434 \u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e:  <\/p>\n<pre><code class=\"go\">package main  import (     &quot;net&quot;     &quot;time&quot; )  func handler(c net.Conn, ch chan string) {     addr := c.RemoteAddr().String()     ch &lt;- addr     time.Sleep(100 * time.Millisecond)     c.Write([]byte(&quot;ok&quot;))     c.Close() }  func logger(wch chan int, results chan int) {     for {         data := &lt;-wch         data++         results &lt;- data     } }  func parse(results chan int) {     for {         &lt;-results     } }  func pool(ch chan string, n int) {     wch := make(chan int)     results := make(chan int)     for i := 0; i &lt; n; i++ {         go logger(wch, results)     }     go parse(results)     for {         addr := &lt;-ch         l := len(addr)         wch &lt;- l     } }  func server(l net.Listener, ch chan string) {     for {         c, err := l.Accept()         if err != nil {             continue         }         go handler(c, ch)     } }  func main() {     l, err := net.Listen(&quot;tcp&quot;, &quot;:5000&quot;)     if err != nil {         panic(err)     }     ch := make(chan string)     go pool(ch, 4)     go server(l, ch)     time.Sleep(10 * time.Second) }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f64\/24e\/b05\/f6424eb0589e47e0a15a53c1d162bd8d.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/servers3\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041c\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 \u043c\u0435\u0436\u0434\u0443 4-\u043c\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043b\u043e\u0433\u0433\u0435\u0440 \u0442\u0430\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c. \u0422\u044b\u0441\u044f\u0447\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u0435. \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438. \u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043f\u0440\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445, \u0447\u0435\u043c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435.<\/p>\n<h4>\u0420\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/h4>\n<p>  \u041d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e fan-in\/fan-out \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440. \u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u043e\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u2014 \u044d\u0442\u043e \u00ab\u0420\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430\u00bb \u043d\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445 \u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u0445, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 &quot;<a href=\"https:\/\/talks.golang.org\/2012\/concurrency.slide\">Go Concurrency Patterns<\/a>&quot;. \u0420\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430 \u044d\u0442\u043e \u0434\u0440\u0435\u0432\u043d\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u0438\u043c\u0438\u0442\u0430. \u0415\u0433\u043e \u0441\u0443\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0432\u044b\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0447\u0438\u0441\u0435\u043b, \u0434\u0435\u043b\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u00ab\u0432 \u043b\u043e\u0431\u00bb \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u043c\u0443\u043b\u044c\u0442\u0438\u044f\u0434\u0435\u0440\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445.<\/p>\n<p>  \u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438 \u0438 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0438 \u044d\u0442\u0430 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u0434\u0435\u043b\u044f\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u0436\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0435 \u2014 \u043e\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443(main) \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u043e\u0436\u0435 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439, \u043d\u043e \u044f \u043d\u0430\u0445\u043e\u0436\u0443 \u0435\u0433\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c. \u0412\u043e\u0442 \u0441\u0430\u043c \u043a\u043e\u0434:  <\/p>\n<pre><code class=\"go\">\/\/ A concurrent prime sieve package main  import &quot;fmt&quot;  \/\/ Send the sequence 2, 3, 4, ... to channel 'ch'. func Generate(ch chan&lt;- int) {     for i := 2; ; i++ {         ch &lt;- i \/\/ Send 'i' to channel 'ch'.     } }  \/\/ Copy the values from channel 'in' to channel 'out', \/\/ removing those divisible by 'prime'. func Filter(in &lt;-chan int, out chan&lt;- int, prime int) {     for {         i := &lt;-in \/\/ Receive value from 'in'.         if i%prime != 0 {             out &lt;- i \/\/ Send 'i' to 'out'.         }     } }  \/\/ The prime sieve: Daisy-chain Filter processes. func main() {     ch := make(chan int) \/\/ Create a new channel.     go Generate(ch)      \/\/ Launch Generate goroutine.     for i := 0; i &lt; 10; i++ {         prime := &lt;-ch         fmt.Println(prime)         ch1 := make(chan int)         go Filter(ch, ch1, prime)         ch = ch1     } }<\/code><\/pre>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/043\/d32\/32d\/043d3232d5ba4217a6e88934b773873d.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/primesieve\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435. \u041c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u043a\u0430\u043a \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u0435\u043d \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0432 3D \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043b\u0443\u0447\u0448\u0435. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430(<i>generate<\/i>) \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (2) \u0432 <i>main<\/i>, \u0437\u0430\u0442\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u043f\u0435\u0440\u0432\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430-\u0444\u0438\u043b\u044c\u0442\u0440, \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0434\u0432\u043e\u0439\u043a\u0438, \u0437\u0430\u0442\u0435\u043c \u0442\u0440\u043e\u0439\u043a\u0438, \u043f\u044f\u0442\u0435\u0440\u043a\u0438, \u0441\u0435\u043c\u0435\u0440\u043a\u0438\u2026 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u043e\u0432\u043e\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <i>main<\/i> \u2014 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0438 \u0432\u0438\u0434\u0435 \u0441\u0432\u0435\u0440\u0445\u0443. \u041a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0432 3D.<\/p>\n<h4>GOMAXPROCS<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0441 \u0432\u043e\u0440\u043a\u0435\u0440\u0430\u043c\u0438. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441 GOMAXPROCS=4? \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b, \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0439\u0441\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0432\u0435\u0436\u0438\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <a href=\"https:\/\/golang.org\/pkg\/runtime\/#GOMAXPROCS\">GOMAXPROCS<\/a>:  <\/p>\n<blockquote><p>GOMAXPROCS \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044f\u0434\u0435\u0440 CPU, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e<\/p><\/blockquote>\n<p>  \u042f \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u043a\u043e\u0434 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0441\u043b\u0435\u0433\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0430\u043b\u0438. \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 Linux-\u043c\u0430\u0448\u0438\u043d\u0435 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u043c\u0438 \u043f\u043e 12 \u044f\u0434\u0435\u0440 \u043a\u0430\u0436\u0434\u044b\u0439 \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441 GOMAXPROCS=1, \u0437\u0430\u0442\u0435\u043c \u0441 GOMAXPROCS=24.<\/p>\n<p>  \u0418\u0442\u0430\u043a. \u043f\u0435\u0440\u0432\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0431\u0435\u0433\u0443\u0449\u0443\u044e \u043d\u0430 1-\u043c \u044f\u0434\u0440\u0435, \u0432\u0442\u043e\u0440\u0430\u044f \u2014 \u043d\u0430 24-\u0445 \u044f\u0434\u0440\u0430\u0445.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/0e7\/949\/e10\/0e7949e106834706944ac1395903d6a1.gif\"\/> <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d14\/243\/bc7\/d14243bc7e2b475f87d93bd8d4212e7c.gif\"\/><\/p>\n<p>  <a href=\"https:\/\/divan.github.io\/demos\/gomaxprocs1\/\">WebGL \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f 1<\/a> <a href=\"https:\/\/divan.github.io\/demos\/gomaxprocs24\/\">WebGL \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f 24<\/a><br \/>  \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0437\u043d\u0430\u044f \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 (\u044f \u0445\u043e\u0442\u0435\u043b, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435), \u043d\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430. \u041f\u0440\u0438 GOMAXPROCS=1 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u0440\u043a\u0435\u0440 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 (\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430) \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441\u0432\u043e\u044e \u043f\u043e\u0440\u0446\u0438\u044e. \u0421 24-\u043c\u044f \u044f\u0434\u0440\u0430\u043c\u0438, \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u043e\u0447\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0433\u0440\u043e\u043c\u043d\u043e.<\/p>\n<p>  \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 GOMAXPROCS \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0434\u0430\u0436\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043e\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440.<\/p>\n<h4>\u0423\u0442\u0435\u0447\u043a\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d<\/h4>\n<p>  \u0427\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043c\u0438\u0440\u0430 concurrency? \u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443, \u044d\u0442\u043e \u0443\u0442\u0435\u0447\u043a\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043b\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0438\u043b\u0438, \u0441\u043a\u0430\u0436\u0435\u043c, \u0435\u0441\u043b\u0438 \u0432\u044b <a href=\"http:\/\/openmymind.net\/Leaking-Goroutines\/\">\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0443, \u043d\u043e \u043e\u043d\u0430 \u0432\u044b\u0448\u043b\u0430 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/a>.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 (\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439) \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0443\u0442\u0435\u0447\u043a\u043e\u0439 \u0433\u043e\u0440\u0443\u0442\u0438\u043d, \u0432 \u043c\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0443\u0436\u0430\u0441\u0430\u044e\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/github.com\/divan\/expvarmon\">expvarmon<\/a> \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430. \u0418 \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u043c\u043e\u0433\u0443 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0436\u0430\u0441\u0430\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e WebGL.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/810\/ee0\/c94\/810ee0c946d5429786943d94f2916b20.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/leak\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><br \/>  \u041c\u043d\u0435 \u0431\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0436\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u044d\u0442\u043e \ud83d\ude42 \u041a\u0430\u0436\u0434\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0438 \u0431\u043e\u043c\u0431\u0430 \u0441 \u0447\u0430\u0441\u043e\u0432\u044b\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<h4>Concurrency is not Parallelism<\/h4>\n<p>  \u0421\u043b\u043e\u0432\u043e concurrency \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442 \u043a\u0430\u043a \u00ab\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u00bb, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0432\u0435\u0440\u043d\u043e. \u041f\u043e \u043f\u0440\u0430\u0432\u0434\u0435, \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u044f \u043d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0437\u0434\u0435 \u0442\u0443\u0442 \u0438 \u043f\u0438\u0448\u0443 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430. \u041d\u043e \u0441\u0430\u043c\u0430 \u0442\u0435\u043c\u0430, \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0449\u0430\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043c\u0435\u0436\u0434\u0443 concurrency \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u043e\u043c <a href=\"https:\/\/existentialtype.wordpress.com\/2011\/03\/17\/parallelism-is-not-concurrency\/\">\u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0430<\/a> <a href=\"https:\/\/ghcmutterings.wordpress.com\/2009\/10\/06\/parallelism-concurrency\/\">\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e<\/a>, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0420\u043e\u0431\u043e\u043c \u041f\u0430\u0439\u043a\u043e\u043c \u0432 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c <a href=\"https:\/\/www.youtube.com\/watch?v=cN_DpYBzKso\">\u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435<\/a>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0435\u0449\u0451 \u043d\u0435.<br \/>  <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/cN_DpYBzKso?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u0442\u043e:  <\/p>\n<blockquote><p>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0448\u0442\u0443\u043a, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e.<br \/>  Concurrency \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.<\/p><\/blockquote>\n<p>  \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0438 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b \u2014 concurrent-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. \u041c\u044b \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 GOMAXPROCS \u2014 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0431\u0435\u0436\u0430\u043b \u043a\u0430\u043a \u043d\u0430 1-\u043c \u044f\u0434\u0440\u0435 (\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e), \u0442\u0430\u043a \u0438 \u043d\u0430 24-\u0445 \u044f\u0434\u0440\u0430\u0445 (\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e).<\/p>\n<p>  \u042f \u043c\u043e\u0433 \u0431\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u043e\u0441\u0442\u0443\u043b\u0430\u0442\u044b \u0438\u0437 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043e \u043c\u0435\u043d\u044f. \u041b\u0443\u0447\u0448\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0448\u0442\u0443\u043a, \u0431\u0435\u0433\u0443\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4d9\/583\/440\/4d95834402834902abbf870bef9f169f.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/parallelism1\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c. \u0415\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0448\u0442\u0443\u043a, \u0447\u0442\u043e, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/687\/022\/93e\/68702293e43842bfbbffc1634657a60a.gif\"\/><br \/>  <a href=\"https:\/\/divan.github.io\/demos\/parallelism2\/\"><b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 WebGL \u0434\u0435\u043c\u043e<\/b><\/a><\/p>\n<p>  \u041d\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u2014 concurrency:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/043\/d32\/32d\/043d3232d5ba4217a6e88934b773873d.gif\"\/><\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u044d\u0442\u043e:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/4c6\/c06\/329\/4c6c06329d724e5e8a73fee25164d900.gif\"\/><\/p>\n<p>  \u0418 \u0432\u043e\u0442 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 concurrency:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/049\/667\/48c\/04966748c1ee4ff7821ada8730a4ebca.gif\"\/><\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e?<\/h4>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0442\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438, \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0434\u0432\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u2014 <i>gotracer<\/i> \u0438 <i>gothree.js<\/i>. \u041f\u0435\u0440\u0432\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0449\u0438:  <\/p>\n<ul>\n<li> \u043f\u0430\u0440\u0441\u0438\u0442 AST-\u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043d\u0430 Go (\u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043b\u044e\u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 Go) \u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a concurrency \u2014 \u0441\u0442\u0430\u0440\u0442\/\u0441\u0442\u043e\u043f \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u043d\u0430\u043b, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u043b\u0430<\/li>\n<li> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/li>\n<li> \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0432\u043e\u0434, \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 JSON \u0441 \u0438\u0432\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0442\u0430\u0439\u043c\u0448\u0442\u0430\u043c\u043f\u0430\u043c\u0438<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e JSON-\u0430:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/295\/392\/c8f\/295392c8ff9b48b8b66487be1d1bd682.png\"\/><\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435, <i>gothree.js<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u043e\u0449\u044c \u0448\u0438\u043a\u0430\u0440\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/threejs.org\/\">Three.js<\/a>, \u0447\u0442\u043e\u0431\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0438 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 3D \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e WebGL. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0440\u0430\u043f\u043f\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u0442\u0438\u0441\u043d\u0443\u0442\u044c \u044d\u0442\u043e \u0432 \u043e\u0434\u043d\u0443 \u0434\u0435\u043c\u043e-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0438 \u0433\u043e\u0442\u043e\u0432\u043e.<\/p>\n<p>  \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d. \u041c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0440\u0435\u0439\u0441. \u0421 \u044d\u0442\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043d\u0435\u0442 \u043b\u0435\u0433\u043a\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043a\u0430\u043d\u0430\u043b\u044b \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043d\u0430\u0447\u0435. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u043c \u2014 \u0432\u044b\u0432\u043e\u0434 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0440\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0433\u043e\u0440\u0443\u0442\u0438\u043d\u044b, \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043a\u0430\u043d\u0430\u043b \u0438 \u0432\u044b\u0445\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0447\u0443\u0442\u044c \u043f\u043e\u0434\u0442\u044e\u043d\u0438\u0432\u0430\u0442\u044c, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044f time.Sleep (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0447\u0443\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430 \u043f\u043e\u044d\u0442\u043e\u043c\u0443).<\/p>\n<p>  \u0412\u043e\u0431\u0449\u0435\u043c-\u0442\u043e. \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043f\u043e\u043a\u0430-\u0447\u0442\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043a\u043e\u0434. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0438\u0433\u0440\u0430\u044e\u0441\u044c \u0435\u0449\u0451 \u0441 <a href=\"https:\/\/golang.org\/cmd\/trace\/\">execution tracer<\/a>-\u043e\u043c \u0414\u043c\u0438\u0442\u0440\u0438\u044f \u0412\u044c\u044e\u043a\u043e\u0432\u0430 \u2014 \u043e\u043d, \u043f\u043e\u0445\u043e\u0436\u0435, \u0434\u0430\u0451\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0445\u043e\u0442\u044f \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043a\u0430\u043d\u0430\u043b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0439\u0441\u0430, \u0431\u0443\u0434\u0443 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0438\u0448\u0438\u0442\u0435 \u043c\u043d\u0435 \u0432 \u0442\u0432\u0438\u0442\u0442\u0435\u0440 \u0438\u043b\u0438 \u0442\u0443\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438. \u0411\u044b\u043b\u043e \u0431\u044b \u043a\u0440\u0443\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0435\u0440\u0435\u0440\u043e\u0441 \u0432 3D concurrency-\u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0439 \u043a \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043d\u0430 Go, \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0430 \u0432 <a href=\"http:\/\/divan.github.io\/talks\/2016\/lviv\/vis_concurrency\/\">\u0432\u0438\u0434\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430<\/a> \u043d\u0430 <a href=\"http:\/\/www.meetup.com\/Lviv-Golang-Group\/events\/227453083\/\">Go Meetup-\u0435 \u0432\u043e \u041b\u044c\u0432\u043e\u0432\u0435 (23 \u044f\u043d\u0432\u0430\u0440\u044f 2016)<\/a>, \u0437\u0430\u0442\u0435\u043c <a href=\"https:\/\/divan.github.io\/posts\/go_concurrency_visualize\/\">\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0432 \u043c\u043e\u0451\u043c \u0431\u043b\u043e\u0433\u0435<\/a>. \u0422\u0430\u043a\u0436\u0435 <a href=\"https:\/\/news.ycombinator.com\/item?id=10981616\">\u043d\u0430 HackerNews<\/a> \u0438 <a href=\"https:\/\/www.reddit.com\/r\/golang\/comments\/42yc77\/visualizing_concurrency_in_go_with_webgl\/\">\u043d\u0430 Reddit<\/a>.               <\/p>\n<div class=\"clear\"><\/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:\/\/habrahabr.ru\/post\/276255\/\"> https:\/\/habrahabr.ru\/post\/276255\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Go \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 concurrency, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0442\u0440\u0443\u0434\u0435 \u0422\u043e\u043d\u0438 \u0425\u043e\u0430\u0440\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Communicating_sequential_processes\">\u00abCommunicating Sequential Processes\u00bb<\/a>. Go \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 concurrent-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u043e \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b concurrency \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e?<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c. \u0412\u0441\u0435 \u043c\u044b, \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043c\u044b\u0441\u043b\u0438\u043c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u044f \u043f\u043e\u043f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441 \u043e \u0447\u0451\u043c-\u0442\u043e, \u0447\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u0430 \u00ab\u043e\u0442 1 \u0434\u043e 100\u00bb, \u0432\u044b \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u0438\u0445 \u00ab\u0443\u0432\u0438\u0434\u0438\u0442\u0435\u00bb \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u043e\u0442\u0434\u0430\u0432\u0430\u044f \u0441\u0435\u0431\u0435 \u0432 \u044d\u0442\u043e\u043c \u043e\u0442\u0447\u0451\u0442. \u042f, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0440\u044f\u0434 \u043e\u0442 1 \u0434\u043e 100 \u0432\u0438\u0436\u0443 \u043a\u0430\u043a \u043b\u0438\u043d\u0438\u044f \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0443\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043e\u0442 \u043c\u0435\u043d\u044f, \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0447\u0438\u0441\u043b\u0435 20 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0449\u0430\u044f \u0434\u043e 1000+. \u0418, \u043f\u043e\u043a\u043e\u043f\u0430\u0432\u0448\u0438\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u044f \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0434\u0435\u0442\u0441\u043a\u043e\u043c \u0441\u0430\u0434\u0443 \u0432 \u0440\u0430\u0437\u0434\u0435\u0432\u0430\u043b\u043a\u0435 \u0432\u0434\u043e\u043b\u044c \u0441\u0442\u0435\u043d\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u043e\u043c\u0435\u0440\u043a\u0438, \u0438 \u0447\u0438\u0441\u043b\u043e 20 \u0431\u044b\u043b\u043e \u043a\u0430\u043a-\u0440\u0430\u0437 \u0432 \u0443\u0433\u043b\u0443. \u0423 \u0432\u0430\u0441 \u0436\u0435, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u0418\u043b\u0438 \u0432\u043e\u0442, \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u0439 \u0433\u043e\u0434 \u0438 4 \u0441\u0435\u0437\u043e\u043d\u0430 \u0433\u043e\u0434\u0430 \u2014 \u043a\u0442\u043e-\u0442\u043e \u0438\u0445 \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u043a \u043a\u0432\u0430\u0434\u0440\u0430\u0442, \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0430\u043d\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0435\u0437\u043e\u043d\u0443, \u043a\u0442\u043e-\u0442\u043e \u2014 \u043a\u0430\u043a \u043a\u0440\u0443\u0433, \u043a\u0442\u043e-\u0442\u043e \u0435\u0449\u0451 \u043a\u0430\u043a-\u0442\u043e.<\/p>\n<p>  \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044c\u0442\u0435 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043e\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b concurrency \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Go \u0438 WebGL. \u042d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0442\u043e, \u043a\u0430\u043a \u044f \u0432\u0438\u0436\u0443 \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u0435. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/043\/d32\/32d\/043d3232d5ba4217a6e88934b773873d.gif\"\/>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-273265","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/273265","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=273265"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/273265\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=273265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=273265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=273265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}