Программирование на JS пользуется спросом у многих современных разработчиков. Этот язык активно применяется для веб-контента. Именно для таких целей он изначально был создан.
По мере развития JavaScript перетерпел огромное количество изменений. Многие сделали язык более функциональным. Большая часть корректировок основана на поточности. Именно о ней пойдет речь далее. Информация будет полезна как новичкам, так и тем, кто уже знаком с основами программирования.
Терминология – перед началом обучения
Но сначала стоит освежить в памяти некоторые термины. Без их понимания не выйдет нормального коддинга:
- алгоритмы – последовательности манипуляций, которые помогают разрешать поставленные перед программером задачи;
- API – правила и принципы с процедурами, протоколами, необходимыми для создания программного обеспечения;
- объект – связанные между собой константы, переменные, структурные сведения, которые можно обрабатывать совместно;
- классы – группы связанных между собой объектов с одинаковыми свойствами;
- компиляция – создание исполняемой утилиты посредством написанного кода;
- константа – неизменяемое значение, встречающееся при функционировании софта;
- массив – группа или перечень похожих между собой электронных сведений, подлежащих группировке;
- переменная – минимальное хранилище информации;
- бесконечный цикл – непрерывное, постоянное повторение элемента программы, которое не останавливается;
- цикл – период «жизни» программного кода или его части;
- оператор – объект, умеющий управлять операндами;
- операнд – объект, подлежащий манипулированию (управлению);
- время выполнения (рантайм) – время, за которое приложение будет выполняться на устройстве.
Теперь с понятиями потоков (threads) и многопоточности контактировать будет намного проще. Без первоначальных знаний в сфере программирования разобраться с соответствующей тематикой достаточно трудно.
О выполнении цикла – синхронная работа
При выполнении кода программеру предстоит иметь дело с разнообразными возможностями и манипуляциями. Они обрабатываются устройством в том или ином порядке.
«Классический» вариант называется последовательным. Или «синхронный». В данном случае выполнение функций или участков кода осуществляется последовательно. А именно:
- Начинается обработка первой операции или задачи.
- Осуществляется выполнение соответствующего участка кодификации в JS или на другом желаемом языке.
- Первая операция завершается.
- Начинается обработка и реализация второй операции.
При подобных обстоятельствах имеет место синхронный код. Функции и элементы программы будут выполняться друг за другом. Если устройству пошлют сразу несколько команд, оно поставит все их в очередь. Далее – обработает в выстроенной последовательности.
Как быть с JS – сколько потоков может обрабатывать
JS – язык программирования, который изначально задумывался как однопоточный. Это значит, что в одном и том же процессе обрабатывается единственный имеющийся набор инструкций. Такой подход можно использовать для облегчения задач, поставленных перед разработчиками.
Java Script на первых порах считался языком, используемым исключительно для добавления интерактивных возможностей на веб-странички. Пример – проверка форм. Для более сложных задач подобный способ общения с программным обеспечением не применялся. Поэтому иногда его называли блокирующим.
Исторические изменения
Но с развитием технологий и прогресса Риан Даль смог круто изменить имеющуюся картину. JS стал полноценным языком программирования, который применяется для решения даже весьма сложных задач в веб-коддинге. И некоторые команды приходится обрабатывать «одновременно». То есть, параллельно.
При помощи специальных приемов и движков можно реализовать асинхронность. В этом случае система возвращает значение не одной функции кода, а нескольких при непосредственной обработке. Подобное решение позволяет использовать Джаву для сложных задач, но не во всех случаях.
Важно: асинхронность иногда приводит к проблемам чтения кодификации, поэтому с данной возможностью необходимо быть очень острожными.
Асинхронность – понятие и особенности
Асинхронность – это многопоточность. В Java Script изначально не предусмотрена, но ее можно добиться через специальные методы, классы, операции, а также движки.
Асинхронность предусматривает следующий вариант работы:
- Даны две строчки кода, идущие друг за другом. Первая – строчка, требующая определенного времени на обработку.
- Первая строка начинает обрабатываться в фоновом режиме.
- В этот момент осуществляется чтение и запуск второй строки. Это происходит без ожидания завершения первой операции.
Именно такой «цикл» называется асинхронным. Он требует определенного количества времени, а также ресурсов задействованного устройства. События при подобных обстоятельствах будут обрабатываться быстрее, если разработчик имеет мощный компьютер.
Пример асинхронности – любая современная операционная система. В них используется этот прием, чтобы пользователь мог параллельно выполнять множество функций: слушать музыку, работать в интернете, запускать несколько программ, а также просматривать картинки и многое другое.
Инструмент Worker
Программисты решили задачу многопоточности в JS интересным способом – создали специальный инструмент реализации нескольких функций кода одновременно. Он должен помочь при создании сложных браузерных утилит. Называется Worker.
Идеи
Воркер лучше всего подходит для реализации следующих идей:
- обработка тяжелых операций, которые могут выполнять асинхронно без блокировки работы интернет-обозревателя;
- вынесение описанных выше манипуляций в отдельные файлы-модули;
- создание для каждого подобного файла браузера объекта Worker, используемого для коммуникаций.
При использовании технологий типа Web Worker удается избежать перегрузки браузера и остановки тех или иных скриптов при выполнении сразу нескольких операций.
Поддержка – есть или нет
Перед тем, как применять в интернет-обозревателе рассматриваемую технологию, требуется удостовериться в том, что имеет место поддержка оной. Для этого нужно осуществить проверку объекта window.Worker.
Возможности
Асинхронный код, реализованный через технологию Worker позволяет обращаться к определенному функционалу, чтобы получить ожидаемый результат. Но данный вариант обладает рядом ограничений, достойных внимания.
Обращаться в процессе работы с Worker-скриптами можно к:
- объекту navigator;
- импорту внешних скриптов с методов importScripts();
- созданию разнообразных объектов через Web Worker;
- setTimeout()/clearTimeout()/SetInterval()/clearInterval();
- XMLHttpRequest;
- кэшу приложений;
- объекту location (только для чтения).
После изучения доступных скриптовых возможностей Воркера стоит рассмотреть имеющиеся ограничения.
Ограничения доступа
Worker-скрипт не имеет доступа к следующим функциям и возможностям:
- модели DOM;
- объекты windows;
- элемент document;
- объект типа parent.
Стоит обратить внимание на то, что методы postMessage и onMessage выступают в качестве глобальных для рассматриваемого инструментария. К оным допускается обращение несколькими способами: напрямую или посредством self/this.
Предельное количество воркеров составляет 256 штук. После этого стек будет считаться переполненным. На экране появится характерное сообщение об ошибке.
Важно: для подписки на отлов ошибок рекомендуется использовать следующую функцию.
Наглядный пример работы
Чтобы понять, как использовать Workers, рекомендуется рассмотреть наглядный пример. В нем:
- имеются два файла-документа: основной и воркера;
- основной называется test.html и пишется внутри HTML-файла;
- воркер обладает названием – worker.js;
- нужно вывести на экран простые числа в установленных рамках – выносится в отдельный фоновый поток;
- код рассматриваемой функции будет расположен в файле worker.js.
Отсюда следует, что документ Test выглядит так:
А сам Воркер:
«Технологии» Async/Await
Асинхронные функции выступают в качестве дополнений к основному синтаксису языка. Они предназначаются для упрощения/ускорения работы некоторых операций при составлении кода.
Если пользоваться async/await, удастся достаточно легко решить проблемы асинхронности в JS. Классы здесь ведут себя как схемы, используемые при создании экземпляров объектов. Prototype служит экземпляром, которому остальные похожие элементы «поручают» основную работу. Не является шаблоном или схемой.
Пользуясь Async/await, можно:
- добавить новый метод для Array;
- учесть, что после этого все массивы смогут задействовать оный метод;
- осуществляется задача посредством затрагивания объекта, назначенного в качестве экземпляра.
Async функции – функции, которые осуществляют возврат так называемых промисов.
Вот пример кода:
var someArray = [1, 2, 3];
Array.prototype.newMethod = function() {
console.log(‘I am a new method!’);
};
someArray.newMethod(); // I am a new method!
// С реальными классами данная кодификация невозможна.
Промисы в помощь
Еще один вариант работы с асинхронностью – это promise. Лежат в основе Async function. Являются обязательными для понимания с многопоточностью в Джаве Скрипт.
Промис – специальный объект, который является асинхронным таском. Он должен обязательно завершиться. Имеет несколько состояний:
- ожидание;
- решение;
- отклонение.
Стоит обратить внимание на то, что если промис выкинут из-за исключений, произойдет поглощение соответствующих исключений. Соответственно, promise способен полностью разрушить имеющийся код или написанную функцию.
В данной статье можно увидеть больше примеров по принципам работы промисов и Async.
Полноценный движок
Несмотря на то, что многопоточность предусматривает разнообразные способы реализации в JavaScript, программисты стараются прибегать к более простым вариантам. Пример – задействование специальных двжиков. С ними не придется применять функции обратного вызова и промисы.
Наиболее интересным вариантом является так называемый NodeJS. Это самостоятельный движок, с которым можно реализовывать многопоточность (multi thread) в Джаве Скрипт. Выступает серверной платформой для работы с JS. Позволяет создавать разнообразные сложные веб-приложения.
Функции, возможности, преимущества
Node – программная платформа, которая делает JS еще более совершенным. Программеры давно знают, что данный язык легко выучить, но на практике он применяется с трудом. Особенно при написании сложного программного обеспечения.
Node позволяет:
- делать из JS язык общего назначения;
- работать с несколькими потоками одновременно;
- взаимодействовать с вводом-выводом через собственный API (он написан на C++);
- подключать внешние библиотеки, составленные посредством иных языков программирования.
Впервые платформа появилась в 2009 году. Сейчас это – мощная платформа для масштабирования и асинхронной работы. За счет данной «утилиты» получается рационально расходовать и распределять имеющиеся машинные ресурсы. Пример – под каждое имеющееся подключение Node будет осуществлять выделение отдельного потока.
Важно: Node совмещается с веб-браузерами, а также Linux, Windows и MacOS.
Где лучше всего использовать
Хороший программер всегда задумывается над тем, когда использовать те или иные возможности языков программирования. В случае с Node лучше всего применять его в контенте:
- который активно связан с вводом и выводом информации;
- задействованном для потоковой передачи электронных материалов;
- интенсивного применения сведений в режиме реального времени (так называемый DIRT);
- одностраничного типа;
- в основе которого лежит JSON API.
А вот для утилит, которые будут при работе сильно загружать и активно использовать центральный процессор Node.JS подходит плохо. Рекомендуется не применять данный движок для подобного софта. Это сильно замедлит работу кода.
Как разобраться в JS и потоках: советы
Для того, чтобы лучше понимать потоки, const, promises и асинхронную работу функций в коде, рекомендуется получить соответствующее образование. Возможны следующие варианты развития событий:
- Получение образования в ВУЗе. По выпуску выдается диплом, но такой вариант отнимает много времени и средств. Узкую специализацию по программированию на JS в России найти трудно.
- Самообразование. Хороший вариант для тех, кто обладает самоконтролем. Никакого подтверждения знаний не будет, зато человек сможет самостоятельно учиться. Тогда, когда удобно. А еще у него останется много времени на практику и сбор портфолио. Наглядные коды и примеры работ при трудоустройстве дают определенные преимущества.
- Поступление в техникум. В этом случае стоит обратить внимание на направление «Программирование». Если есть – «Веб-программирование». Помогает в будущем поступить в ВУЗ. По выпуску выдается диплом о среднем профессиональном образовании. Недостаток лишь один – обучение охватывает программирование, функции, циклы и коддинг в общих чертах.
Еще один вариант развития событий – прохождение специализированных курсов. Сейчас ими можно пользоваться дистанционно. Преимуществ полно. А именно:
- возможность учиться тогда, когда удобно;
- для образовательного процесса требуется только подключение к интернету;
- наличие практики и возможность собрать портфолио;
- лояльные сроки обучения – от пары месяцев до года.
По выпуску выдается сертификат установленной формы. Можно подобрать узкоспециализированные https://otus.ru/catalog/courses?categories=programming на ДжавеСкрипт и не только. Предложения актуальны и для чайников, и для опытных программеров.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Java Script и потоки: полезная информация о многопоточности OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Программирование на JS пользуется спросом у многих современных разработчиков. Этот язык активно применяется для веб-контента. Именно для таких целей он изначально был создан. По мере развития JavaScript перетерпел огромное количество изменений. Многие сделали язык более функциональным. Большая часть корректировок основана на поточности. Именно о ней пойдет речь далее. Информация будет полезна как новичкам, так и" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#article","name":"Java Script \u0438 \u043f\u043e\u0442\u043e\u043a\u0438: \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 OTUS","headline":"Java Script \u0438 \u043f\u043e\u0442\u043e\u043a\u0438: \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/02\/oj-1080x720-2.png","width":1080,"height":720},"datePublished":"2022-02-03T17:46:19+00:00","dateModified":"2022-02-03T17:46:21+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#listItem","position":2,"name":"Java Script \u0438 \u043f\u043e\u0442\u043e\u043a\u0438: \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#webpage","url":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/","name":"Java Script \u0438 \u043f\u043e\u0442\u043e\u043a\u0438: \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 OTUS","description":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 JS \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u043e\u0441\u043e\u043c \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0435\u0431-\u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043e\u043d \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d. \u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f JavaScript \u043f\u0435\u0440\u0435\u0442\u0435\u0440\u043f\u0435\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u041c\u043d\u043e\u0433\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044f\u0437\u044b\u043a \u0431\u043e\u043b\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u043e \u043d\u0435\u0439 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u0434\u0430\u043b\u0435\u0435. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u043a\u0430\u043a \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u0442\u0430\u043a \u0438","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/02\/oj-1080x720-2.png","@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/#mainImage"},"datePublished":"2022-02-03T17:46:19+00:00","dateModified":"2022-02-03T17:46:21+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/2800" /><link rel='shortlink' href='https://otus.ru/journal/?p=2800' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-2800 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-2800" class="the-post post-2800 post type-post status-publish format-standard has-post-thumbnail category-polza tag-javascript">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Java Script и потоки: полезная информация о многопоточности
</h1>
<a href="https://otus.ru/journal/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti/" class="date-link" data-wpel-link="internal"><time class="post-date">3 февраля, 2022</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Java Script и потоки: полезная информация о многопоточности" title="Java Script и потоки: полезная информация о многопоточности" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-2-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%E2%80%93_%D0%BF%D0%B5%D1%80%D0%B5%D0%B4_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%BE%D0%BC_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F" title="Терминология – перед началом обучения">Терминология – перед началом обучения</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9E_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%E2%80%93_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0" title="О выполнении цикла – синхронная работа">О выполнении цикла – синхронная работа</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9A%D0%B0%D0%BA_%D0%B1%D1%8B%D1%82%D1%8C_%D1%81_JS_%E2%80%93_%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2_%D0%BC%D0%BE%D0%B6%D0%B5%D1%82_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D1%82%D1%8C" title="Как быть с JS – сколько потоков может обрабатывать">Как быть с JS – сколько потоков может обрабатывать</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F" title="Исторические изменения">Исторические изменения</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%90%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%E2%80%93_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B8_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8" title="Асинхронность – понятие и особенности">Асинхронность – понятие и особенности</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_Worker" title="Инструмент Worker">Инструмент Worker</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%98%D0%B4%D0%B5%D0%B8" title="Идеи">Идеи</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0_%E2%80%93_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BB%D0%B8_%D0%BD%D0%B5%D1%82" title="Поддержка – есть или нет">Поддержка – есть или нет</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8" title="Возможности">Возможности</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0" title="Ограничения доступа">Ограничения доступа</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B" title="Наглядный пример работы">Наглядный пример работы</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%C2%AB%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8%C2%BB_AsyncAwait" title="«Технологии» Async/Await">«Технологии» Async/Await</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9F%D1%80%D0%BE%D0%BC%D0%B8%D1%81%D1%8B_%D0%B2_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C" title="Промисы в помощь">Промисы в помощь</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA" title="Полноценный движок">Полноценный движок</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0" title="Функции, возможности, преимущества">Функции, возможности, преимущества</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%93%D0%B4%D0%B5_%D0%BB%D1%83%D1%87%D1%88%D0%B5_%D0%B2%D1%81%D0%B5%D0%B3%D0%BE_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C" title="Где лучше всего использовать">Где лучше всего использовать</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%9A%D0%B0%D0%BA_%D1%80%D0%B0%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C%D1%81%D1%8F_%D0%B2_JS_%D0%B8_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D1%85_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B" title="Как разобраться в JS и потоках: советы">Как разобраться в JS и потоках: советы</a></li></ul></nav></div>
<p>Программирование на JS пользуется спросом у многих современных разработчиков. Этот язык активно применяется для веб-контента. Именно для таких целей он изначально был создан.</p>
<p>По мере развития JavaScript перетерпел огромное количество изменений. Многие сделали язык более функциональным. Большая часть корректировок основана на поточности. Именно о ней пойдет речь далее. Информация будет полезна как новичкам, так и тем, кто уже знаком с основами программирования.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A2%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%E2%80%93_%D0%BF%D0%B5%D1%80%D0%B5%D0%B4_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%BE%D0%BC_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"></span>Терминология – перед началом обучения<span class="ez-toc-section-end"></span></h2>
<p>Но сначала стоит освежить в памяти некоторые термины. Без их понимания не выйдет нормального коддинга:</p>
<ul><li>алгоритмы – последовательности манипуляций, которые помогают разрешать поставленные перед программером задачи;</li><li>API – правила и принципы с процедурами, протоколами, необходимыми для создания программного обеспечения;</li><li>объект – связанные между собой константы, переменные, структурные сведения, которые можно обрабатывать совместно;</li><li>классы – группы связанных между собой объектов с одинаковыми свойствами;</li><li>компиляция – создание исполняемой утилиты посредством написанного кода;</li><li>константа – неизменяемое значение, встречающееся при функционировании софта;</li><li>массив – группа или перечень похожих между собой электронных сведений, подлежащих группировке;</li><li>переменная – минимальное хранилище информации;</li><li>бесконечный цикл – непрерывное, постоянное повторение элемента программы, которое не останавливается;</li><li>цикл – период «жизни» программного кода или его части;</li><li>оператор – объект, умеющий управлять операндами;</li><li>операнд – объект, подлежащий манипулированию (управлению);</li><li>время выполнения (рантайм) – время, за которое приложение будет выполняться на устройстве.</li></ul>
<p>Теперь с понятиями потоков (threads) и многопоточности контактировать будет намного проще. Без первоначальных знаний в сфере программирования разобраться с соответствующей тематикой достаточно трудно.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%E2%80%93_%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0"></span>О выполнении цикла – синхронная работа<span class="ez-toc-section-end"></span></h2>
<p>При выполнении кода программеру предстоит иметь дело с разнообразными возможностями и манипуляциями. Они обрабатываются устройством в том или ином порядке.</p>
<p>«Классический» вариант называется последовательным. Или «синхронный». В данном случае выполнение функций или участков кода осуществляется последовательно. А именно:</p>
<ul><li>Начинается обработка первой операции или задачи.</li><li>Осуществляется выполнение соответствующего участка кодификации в JS или на другом желаемом языке.</li><li>Первая операция завершается.</li><li>Начинается обработка и реализация второй операции.</li></ul>
<p> При подобных обстоятельствах имеет место синхронный код. Функции и элементы программы будут выполняться друг за другом. Если устройству пошлют сразу несколько команд, оно поставит все их в очередь. Далее – обработает в выстроенной последовательности.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%B1%D1%8B%D1%82%D1%8C_%D1%81_JS_%E2%80%93_%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2_%D0%BC%D0%BE%D0%B6%D0%B5%D1%82_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D1%82%D1%8C"></span>Как быть с JS – сколько потоков может обрабатывать<span class="ez-toc-section-end"></span></h2>
<p>JS – язык программирования, который изначально задумывался как однопоточный. Это значит, что в одном и том же процессе обрабатывается единственный имеющийся набор инструкций. Такой подход можно использовать для облегчения задач, поставленных перед разработчиками.</p>
<p>Java Script на первых порах считался языком, используемым исключительно для добавления интерактивных возможностей на веб-странички. Пример – проверка форм. Для более сложных задач подобный способ общения с программным обеспечением не применялся. Поэтому иногда его называли блокирующим.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F"></span>Исторические изменения<span class="ez-toc-section-end"></span></h3>
<p>Но с развитием технологий и прогресса Риан Даль смог круто изменить имеющуюся картину. JS стал полноценным языком программирования, который применяется для решения даже весьма сложных задач в веб-коддинге. И некоторые команды приходится обрабатывать «одновременно». То есть, параллельно.</p>
<p>При помощи специальных приемов и движков можно реализовать асинхронность. В этом случае система возвращает значение не одной функции кода, а нескольких при непосредственной обработке. Подобное решение позволяет использовать Джаву для сложных задач, но не во всех случаях.</p>
<p>Важно: асинхронность иногда приводит к проблемам чтения кодификации, поэтому с данной возможностью необходимо быть очень острожными.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%90%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%E2%80%93_%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D0%B8_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8"></span>Асинхронность – понятие и особенности<span class="ez-toc-section-end"></span></h2>
<p>Асинхронность – это многопоточность. В Java Script изначально не предусмотрена, но ее можно добиться через специальные методы, классы, операции, а также движки.</p>
<p>Асинхронность предусматривает следующий вариант работы:</p>
<ol type="1"><li>Даны две строчки кода, идущие друг за другом. Первая – строчка, требующая определенного времени на обработку.</li><li>Первая строка начинает обрабатываться в фоновом режиме.</li><li>В этот момент осуществляется чтение и запуск второй строки. Это происходит без ожидания завершения первой операции.</li></ol>
<p>Именно такой «цикл» называется асинхронным. Он требует определенного количества времени, а также ресурсов задействованного устройства. События при подобных обстоятельствах будут обрабатываться быстрее, если разработчик имеет мощный компьютер.</p>
<p>Пример асинхронности – любая современная операционная система. В них используется этот прием, чтобы пользователь мог параллельно выполнять множество функций: слушать музыку, работать в интернете, запускать несколько программ, а также просматривать картинки и многое другое.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82_Worker"></span>Инструмент Worker<span class="ez-toc-section-end"></span></h2>
<p>Программисты решили задачу многопоточности в JS интересным способом – создали специальный инструмент реализации нескольких функций кода одновременно. Он должен помочь при создании сложных браузерных утилит. Называется Worker.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D0%B4%D0%B5%D0%B8"></span>Идеи<span class="ez-toc-section-end"></span></h3>
<p>Воркер лучше всего подходит для реализации следующих идей:</p>
<ul><li>обработка тяжелых операций, которые могут выполнять асинхронно без блокировки работы интернет-обозревателя;</li><li>вынесение описанных выше манипуляций в отдельные файлы-модули;</li><li>создание для каждого подобного файла браузера объекта Worker, используемого для коммуникаций.</li></ul>
<p>При использовании технологий типа Web Worker удается избежать перегрузки браузера и остановки тех или иных скриптов при выполнении сразу нескольких операций.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0_%E2%80%93_%D0%B5%D1%81%D1%82%D1%8C_%D0%B8%D0%BB%D0%B8_%D0%BD%D0%B5%D1%82"></span>Поддержка – есть или нет<span class="ez-toc-section-end"></span></h3>
<p>Перед тем, как применять в интернет-обозревателе рассматриваемую технологию, требуется удостовериться в том, что имеет место поддержка оной. Для этого нужно осуществить проверку объекта window.Worker.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8"></span>Возможности<span class="ez-toc-section-end"></span></h3>
<p>Асинхронный код, реализованный через технологию Worker позволяет обращаться к определенному функционалу, чтобы получить ожидаемый результат. Но данный вариант обладает рядом ограничений, достойных внимания.</p>
<p>Обращаться в процессе работы с Worker-скриптами можно к:</p>
<ul><li>объекту navigator;</li><li>импорту внешних скриптов с методов importScripts();</li><li>созданию разнообразных объектов через Web Worker;</li><li>setTimeout()/clearTimeout()/SetInterval()/clearInterval();</li><li>XMLHttpRequest;</li><li>кэшу приложений;</li><li>объекту location (только для чтения).</li></ul>
<p>После изучения доступных скриптовых возможностей Воркера стоит рассмотреть имеющиеся ограничения.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0"></span>Ограничения доступа<span class="ez-toc-section-end"></span></h3>
<p>Worker-скрипт не имеет доступа к следующим функциям и возможностям:</p>
<ul><li>модели DOM;</li><li>объекты windows;</li><li>элемент document;</li><li>объект типа parent.</li></ul>
<p>Стоит обратить внимание на то, что методы postMessage и onMessage выступают в качестве глобальных для рассматриваемого инструментария. К оным допускается обращение несколькими способами: напрямую или посредством self/this.</p>
<p>Предельное количество воркеров составляет 256 штук. После этого стек будет считаться переполненным. На экране появится характерное сообщение об ошибке.</p>
<p>Важно: для подписки на отлов ошибок рекомендуется использовать следующую функцию.</p>
<figure class="wp-block-image size-large"><img decoding="async" width="449" height="30" src="https://otus.ru/journal/wp-content/uploads/2022/02/1-2.jpg" alt="Java Script и потоки: полезная информация о многопоточности" class="wp-image-2803" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/1-2.jpg 449w, https://otus.ru/journal/wp-content/uploads/2022/02/1-2-300x20.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/1-2-150x10.jpg 150w" sizes="(max-width: 449px) 100vw, 449px" /></figure>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B"></span>Наглядный пример работы<span class="ez-toc-section-end"></span></h3>
<p>Чтобы понять, как использовать Workers, рекомендуется рассмотреть наглядный пример. В нем:</p>
<ul><li>имеются два файла-документа: основной и воркера;</li><li>основной называется test.html и пишется внутри HTML-файла;</li><li>воркер обладает названием – worker.js;</li><li>нужно вывести на экран простые числа в установленных рамках – выносится в отдельный фоновый поток;</li><li>код рассматриваемой функции будет расположен в файле worker.js.</li></ul>
<p>Отсюда следует, что документ Test выглядит так:</p>
<figure class="wp-block-image size-large"><img decoding="async" width="586" height="269" src="https://otus.ru/journal/wp-content/uploads/2022/02/2-2.jpg" alt="Java Script и потоки: полезная информация о многопоточности" class="wp-image-2804" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/2-2.jpg 586w, https://otus.ru/journal/wp-content/uploads/2022/02/2-2-300x138.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/2-2-150x69.jpg 150w" sizes="(max-width: 586px) 100vw, 586px" /></figure>
<p>А сам Воркер:</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="461" height="405" src="https://otus.ru/journal/wp-content/uploads/2022/02/3-1.jpg" alt="Java Script и потоки: полезная информация о многопоточности" class="wp-image-2805" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/3-1.jpg 461w, https://otus.ru/journal/wp-content/uploads/2022/02/3-1-300x264.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/3-1-150x132.jpg 150w" sizes="(max-width: 461px) 100vw, 461px" /></figure>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%C2%AB%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8%C2%BB_AsyncAwait"></span>«Технологии» Async/Await<span class="ez-toc-section-end"></span></h2>
<p>Асинхронные функции выступают в качестве дополнений к основному синтаксису языка. Они предназначаются для упрощения/ускорения работы некоторых операций при составлении кода.</p>
<p>Если пользоваться async/await, удастся достаточно легко решить проблемы асинхронности в JS. Классы здесь ведут себя как схемы, используемые при создании экземпляров объектов. Prototype служит экземпляром, которому остальные похожие элементы «поручают» основную работу. Не является шаблоном или схемой.</p>
<p>Пользуясь Async/await, можно:</p>
<ul><li>добавить новый метод для Array;</li><li>учесть, что после этого все массивы смогут задействовать оный метод;</li><li>осуществляется задача посредством затрагивания объекта, назначенного в качестве экземпляра.</li></ul>
<p>Async функции – функции, которые осуществляют возврат так называемых промисов.</p>
<p>Вот пример кода:</p>
<pre class="wp-block-code"><code>var someArray = [1, 2, 3];
Array.prototype.newMethod = function() {
console.log(‘I am a new method!’);
};
someArray.newMethod(); // I am a new method!
// С реальными классами данная кодификация невозможна.
</code></pre>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%BE%D0%BC%D0%B8%D1%81%D1%8B_%D0%B2_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C"></span>Промисы в помощь<span class="ez-toc-section-end"></span></h3>
<p>Еще один вариант работы с асинхронностью – это promise. Лежат в основе Async function. Являются обязательными для понимания с многопоточностью в Джаве Скрипт.</p>
<p>Промис – специальный объект, который является асинхронным таском. Он должен обязательно завершиться. Имеет несколько состояний:</p>
<ul><li>ожидание;</li><li>решение;</li><li>отклонение.</li></ul>
<p>Стоит обратить внимание на то, что если промис выкинут из-за исключений, произойдет поглощение соответствующих исключений. Соответственно, promise способен полностью разрушить имеющийся код или написанную функцию.</p>
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="459" height="220" src="https://otus.ru/journal/wp-content/uploads/2022/02/4-1.jpg" alt="Java Script и потоки: полезная информация о многопоточности" class="wp-image-2806" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/4-1.jpg 459w, https://otus.ru/journal/wp-content/uploads/2022/02/4-1-300x144.jpg 300w, https://otus.ru/journal/wp-content/uploads/2022/02/4-1-150x72.jpg 150w" sizes="(max-width: 459px) 100vw, 459px" /></figure>
<p>В данной <a href="https://stasonmars.ru/javascript/promisy-v-javascript-dlya-chainikov/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">статье<span class="wpel-icon wpel-image wpel-icon-6"></span></a> можно увидеть больше примеров по принципам работы промисов и <a href="https://stasonmars.ru/javascript/polnoe-ponimanie-syncronnogo-i-asyncronnogo-javascript-s-async-await/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Async<span class="wpel-icon wpel-image wpel-icon-6"></span></a>.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%86%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%B8%D0%B6%D0%BE%D0%BA"></span>Полноценный движок<span class="ez-toc-section-end"></span></h2>
<p>Несмотря на то, что многопоточность предусматривает разнообразные способы реализации в JavaScript, программисты стараются прибегать к более простым вариантам. Пример – задействование специальных двжиков. С ними не придется применять функции обратного вызова и промисы.</p>
<p>Наиболее интересным вариантом является так называемый NodeJS. Это самостоятельный движок, с которым можно реализовывать многопоточность (multi thread) в Джаве Скрипт. Выступает серверной платформой для работы с JS. Позволяет создавать разнообразные сложные веб-приложения.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BF%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0"></span>Функции, возможности, преимущества<span class="ez-toc-section-end"></span></h3>
<p>Node – программная платформа, которая делает JS еще более совершенным. Программеры давно знают, что данный язык легко выучить, но на практике он применяется с трудом. Особенно при написании сложного программного обеспечения.</p>
<p>Node позволяет:</p>
<ul><li>делать из JS язык общего назначения;</li><li>работать с несколькими потоками одновременно;</li><li>взаимодействовать с вводом-выводом через собственный API (он написан на C++);</li><li>подключать внешние библиотеки, составленные посредством иных языков программирования.</li></ul>
<p>Впервые платформа появилась в 2009 году. Сейчас это – мощная платформа для масштабирования и асинхронной работы. За счет данной «утилиты» получается рационально расходовать и распределять имеющиеся машинные ресурсы. Пример – под каждое имеющееся подключение Node будет осуществлять выделение отдельного потока.</p>
<p>Важно: Node совмещается с веб-браузерами, а также Linux, Windows и MacOS.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%93%D0%B4%D0%B5_%D0%BB%D1%83%D1%87%D1%88%D0%B5_%D0%B2%D1%81%D0%B5%D0%B3%D0%BE_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C"></span>Где лучше всего использовать<span class="ez-toc-section-end"></span></h3>
<p>Хороший программер всегда задумывается над тем, когда использовать те или иные возможности языков программирования. В случае с Node лучше всего применять его в контенте:</p>
<ul><li>который активно связан с вводом и выводом информации;</li><li>задействованном для потоковой передачи электронных материалов;</li><li>интенсивного применения сведений в режиме реального времени (так называемый DIRT);</li><li>одностраничного типа;</li><li>в основе которого лежит JSON API.</li></ul>
<p>А вот для утилит, которые будут при работе сильно загружать и активно использовать центральный процессор Node.JS подходит плохо. Рекомендуется не применять данный движок для подобного софта. Это сильно замедлит работу кода.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D1%80%D0%B0%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D1%8C%D1%81%D1%8F_%D0%B2_JS_%D0%B8_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D1%85_%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B"></span>Как разобраться в JS и потоках: советы<span class="ez-toc-section-end"></span></h2>
<p>Для того, чтобы лучше понимать потоки, const, promises и асинхронную работу функций в коде, рекомендуется получить соответствующее образование. Возможны следующие варианты развития событий:</p>
<ol type="1"><li>Получение образования в ВУЗе. По выпуску выдается диплом, но такой вариант отнимает много времени и средств. Узкую специализацию по программированию на JS в России найти трудно.</li><li>Самообразование. Хороший вариант для тех, кто обладает самоконтролем. Никакого подтверждения знаний не будет, зато человек сможет самостоятельно учиться. Тогда, когда удобно. А еще у него останется много времени на практику и сбор портфолио. Наглядные коды и примеры работ при трудоустройстве дают определенные преимущества.</li><li>Поступление в техникум. В этом случае стоит обратить внимание на направление «Программирование». Если есть – «Веб-программирование». Помогает в будущем поступить в ВУЗ. По выпуску выдается диплом о среднем профессиональном образовании. Недостаток лишь один – обучение охватывает программирование, функции, циклы и коддинг в общих чертах.</li></ol>
<p>Еще один вариант развития событий – прохождение специализированных курсов. Сейчас ими можно пользоваться дистанционно. Преимуществ полно. А именно:</p>
<ul><li>возможность учиться тогда, когда удобно;</li><li>для образовательного процесса требуется только подключение к интернету;</li><li>наличие практики и возможность собрать портфолио;</li><li>лояльные сроки обучения – от пары месяцев до года.</li></ul>
<p>По выпуску выдается сертификат установленной формы. Можно подобрать узкоспециализированные https://otus.ru/catalog/courses?categories=programming на ДжавеСкрипт и не только. Предложения актуальны и для чайников, и для опытных программеров.</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/lessons/specializacija-fullstack-dev/?utm_source=oj&utm_medium=affilate&utm_campaign=spec_js" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="70" src="https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-1.png" alt="Java Script и потоки: полезная информация о многопоточности" class="wp-image-2802" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-1.png 970w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-1-300x22.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-1-150x11.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/JS-FullstackSpec_Headline_970x70-16-1-768x55.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/javascript/" rel="tag" data-wpel-link="internal">JavaScript</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F&text=Java%20Script%20%D0%B8%20%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8%3A%20%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B0%D1%8F%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BE%20%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fjava-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2022%2F02%2Foj-1080x720-2.png&description=Java%20Script%20%D0%B8%20%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8%3A%20%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%B0%D1%8F%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BE%20%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/zamykaniya-v-javascript-kak-ne-nadelat-oshibok/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/zamykaniya-v-javascript-kak-ne-nadelat-oshibok/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Замыкания в JavaScript: как не наделать ошибок" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-1-1-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Замыкания в JavaScript: как не наделать ошибок" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/zamykaniya-v-javascript-kak-ne-nadelat-oshibok/" data-wpel-link="internal">Замыкания в JavaScript: как не наделать ошибок</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/zamykaniya-v-javascript-kak-ne-nadelat-oshibok/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-02-03T17:32:31+00:00">3 февраля, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">10 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Модульное программирование в JavaScript от А до Я" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/02/oj-1080x720-4-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Модульное программирование в JavaScript от А до Я" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" data-wpel-link="internal">Модульное программирование в JavaScript от А до Я</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/modulnoe-programmirovanie-v-javascript-ot-a-do-ya/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-02-03T18:43:14+00:00">3 февраля, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">8 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/java-script-i-potoki-poleznaya-informaciya-o-mnogopotochnosti\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Mon, 09 Mar 2026 17:34:18 GMT -->