Node.js многопоточность: что такое рабочие потоки и как они работают? - PullRequest
0 голосов
/ 14 июля 2020

Я всегда считал, что JS является однопоточным языком, что делает его неэффективным для задач с интенсивным использованием ЦП. Недавно я столкнулся с рабочими потоками и тем, как они решают эту проблему неэффективности, создавая «несколько рабочих потоков в одном процессе». В чем разница между процессом и потоком? Почему JS внезапно способен порождать несколько рабочих потоков, которые помогают и взаимодействуют с основным потоком JS, чтобы обеспечить параллелизм? Не могли бы вы помочь мне понять этот топи c непрофессиональным языком? Спасибо

1 Ответ

1 голос
/ 14 июля 2020

Начиная с узла v10, они представили WorkerThreads. WorkerThread - это совершенно новый экземпляр интерпретатора V8 Javascript. У него есть собственный набор переменных, собственные глобальные переменные и собственный поток выполнения Javascript. Вы не можете напрямую совместно использовать обычные Javascript переменные между основным потоком и workerThread или между workerThreads.

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

Основной поток и workerThreads могут отправлять сообщения друг другу, и эти сообщения могут содержать некоторые типы данных структуры, которые будут скопированы с помощью механизма структурированного клонирования и отправлены в другой экземпляр V8. полезно для серверов), чтобы вы могли запустить один или несколько workerThreads для обработки ресурсоемкой работы и оставить основное событие thead l oop свободным и реагировать на входящие события / network / et c ...

Вы также можете сделать нечто подобное, создав несколько процессов nodejs. Но процесс является более тяжелым, чем workerThread, и workerThreads позволяет вам совместно использовать память с SharedMemory, тогда как отдельные процессы этого не делают.

...