Как стать автором
Обновить

Играем с потоками в Node.JS 10.5.0

Время прочтения 6 мин
Просмотры 8.3K
Node.JS *
Из песочницы

Доброго времени суток



У меня на работе возник спор между мной и дотнетчиками насчет потоков в новой версии Node.JS и необходимости их синхронизоровать. Для начала решили выбрать задачу о параллельной записи строк в файл. Тема с worker_threads горячая, прошу под кат.
Читать дальше →
Всего голосов 11: ↑8 и ↓3 +5
Комментарии 14

Подключаем онлайн-карты к навигатору на смартфоне. Часть 2 – векторные карты

Время прочтения 14 мин
Просмотры 1.9K
Google Chrome Node.JS *OpenStreetMap *Геоинформационные сервисы *
Туториал

Пишем серверное приложение, которое будет генерировать растровые PNG тайлы на основе векторных онлайн-карт. Использование веб-срейпинга с помощью Puppeteer для получения картографических данных.

Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 4

Node.js: Heroes of Worker Threads ― C++ Addon

Время прочтения 8 мин
Просмотры 3.9K
Высокая производительность *JavaScript *Node.JS *

Node.js имеет несколько способов исполнения CPU-bound заданий:

1. Просто запустить CPU-bound задачу в одном процессе, блокируя event loop. Кто-то может возразить, что это совсем не вариант, но если этот процесс был специально создан для этой задачи, то почему бы и нет. Правда не у всех есть пара дополнительных ядер.

2. Создать отдельные процессы (Child Processes), распределить между ними задания.

3. Создать cluster и заставить работать отдельные процессы в нем.

4. Использовать Worker Threads и создать несколько дополнительных потоков исполнения.

5. Попросить C++ разработчика написать C++ Addon, который загадочным образом выполняет CPU-bound задания. В конце концов, думаю все слышали старинные легенды про компилируемые языки программирования и о том, что “нативная” реализация ― это всегда успех (на этой фразе где-то в мире должен заплакать React Native разработчик, смотря на перформанс своего приложения).

Читать далее
Всего голосов 13: ↑13 и ↓0 +13
Комментарии 1

Приручаем многопоточность в Node.js (часть 1/5: базовые концепты)

Время прочтения 8 мин
Просмотры 8.5K
Блог компании Тензор Высокая производительность *JavaScript *Программирование *Node.JS *
Туториал
✏️ Технотекст 2022

Продолжаем серию статей, посвященных разным прикладным концептуальным решениям, которые могут существенно "прокачать" производительность вашего Node.js-приложения.

В прошлой статье мы рассмотрели реализацию эффективной очереди на основе "эластичного" кольцевого буфера, а в этой попробуем разобраться с особенностями использования модуля Worker threads в Node.js - какие проблемы внедрения многопоточности будут нас ждать при попытках сделать код более производительным, и узнаем, как их можно обойти, применяя типовые концепты.

Начнем с достаточно типовой задачи: мы получаем некоторые сообщения, и нам их надо как-то обработать. В качестве тестового примера сгенерируем эти сообщения самостоятельно, и посмотрим, за какое минимальное время мы сможем вычислить SHA-256-хэш для каждого из них.

Читать далее
Всего голосов 21: ↑21 и ↓0 +21
Комментарии 5

Приручаем многопоточность в Node.js (часть 2/5: очередь, каналы и координатор)

Время прочтения 16 мин
Просмотры 3.9K
Блог компании Тензор Высокая производительность *JavaScript *Программирование *Node.JS *
Туториал

В первой части статьи мы остановились на моменте, когда с помощью распределения задач между потоками по алгоритму Round-robin мы добились-таки ускорения работы приложения за счет многопоточности.

Но вот неприятность: такой алгоритм очень неравномерно нагружает потоки и не полностью утилизирует их возможности - пока кто-то простаивает, другой уже копит очередь. Как это можно обойти?

Читать далее
Всего голосов 14: ↑14 и ↓0 +14
Комментарии 8

Приручаем многопоточность в Node.js (часть 3/5: разделяемая память, атомарные операции и блокировки)

Время прочтения 12 мин
Просмотры 3K
Блог компании Тензор Высокая производительность *JavaScript *Программирование *Node.JS *
Туториал

В предыдущей части мы остановились на мысли, что минимизировать простой вспомогательных потоков нашего приложения можно, если заставить их самих получать себе задачи, не дожидаясь, пока их загрузит кто-то другой со стороны.

Но тут возникает две проблемы:

1. как эффективно доставить данные в обрабатывающий поток

2. как распределять задачи между активными потоками, чтобы ничего не пропустить, но и дважды не обработать

В этом нам как раз и помогут два рассматриваемых в этой статье концепта работы с многопоточностью: разделяемая (shared) память и потокобезопасные (thread-safe, Atomics) операции над ней.

Читать далее
Всего голосов 21: ↑21 и ↓0 +21
Комментарии 7

Приручаем многопоточность в Node.js (часть 4/5: координатор против синхронного кода)

Время прочтения 11 мин
Просмотры 3K
Блог компании Тензор Высокая производительность *JavaScript *Программирование *Node.JS *
Туториал

В предыдущей части мы научились эффективно передавать данные вспомогательным потокам из основного через разделяемую память, используя Atomics-операции и блокировки.

Но мы рассматривали все-таки идеальную ситуацию, когда основной поток больше ничем не занимался, кроме обмена с "подчиненными" уже заранее готовыми данными. В реальных же приложениях такое встречается достаточно редко - обычно эти самые данные приходится готовить непосредственно перед передачей. И, бывает, в этом участвует существенная доля синхронного кода, что для JavaScript крайне неприятно, но иногда неизбежно - например, при вычислении регулярных выражений.

Давайте оценим, насколько синхронные операции "роняют" производительность нашего тестового приложения. И узнаем, как можно в разы улучшить ее, "скрестив ужа с ежом", используя выделенный поток-координатор из позапрошлой части статьи совместно с разделяемой памятью.

Читать далее
Всего голосов 17: ↑15 и ↓2 +13
Комментарии 12