Есть ли способ создать потоки для запуска нескольких методов одновременно?
Таким образом, в случае сбоя любого метода между всеми остальными потоками, он должен быть уничтожен.
Есть ли способ создать потоки для запуска нескольких методов одновременно?
Таким образом, в случае сбоя любого метода между всеми остальными потоками, он должен быть уничтожен.
Каждый процесс node.js является однопоточным по дизайну. Поэтому для получения нескольких потоков вам необходимо иметь несколько процессов (как указывали некоторые другие плакаты, есть также библиотеки, на которые вы можете ссылаться, что даст вам возможность работать с потоками в Node, но таких возможностей не существует без эти библиотеки. См. ответ Shawn Vincent, ссылающийся на https://github.com/audreyt/node-webworker-threads)
Вы можете запускать дочерние процессы из основного процесса, как показано здесь, в документации node.js: http://nodejs.org/api/child_process.html. Примеры довольно хороши на этой странице и довольно прямолинейны.
Затем ваш родительский процесс может наблюдать за событием закрытия при любом запущенном процессе, а затем может заставить закрыть другие процессы, которые вы начали, чтобы достичь того, что вы не можете остановить всю стратегию остановки, о которой вы говорите.
Также смотрите: Node.js на многоядерных машинах
Существует также, по меньшей мере, одна библиотека для выполнения собственных потоков из Node.js: node -webworker-threads
https://github.com/audreyt/node-webworker-threads
В основном это реализует API веб-браузера для Node.js.
С узла 10.5 теперь есть поддержка многопоточности, но она экспериментальная. Надеюсь, что это скоро станет стабильным.
Оформить заказ на следующие ресурсы:
Обновление:
Начиная с узла v11.7.0 и далее, вам не нужно использовать флаг --experimental-worker
.
Release Note: https://nodejs.org/en/blog/release/v11.7.0/
Вы можете получить многопоточность, используя Napa.js.
https://github.com/Microsoft/napajs
"Napa.js - многопоточная среда выполнения JavaScript, построенная на V8, которая изначально была разработана для разработки высокотератичных сервисов с не-скомпрометированной производительностью в Bing. По мере того, как она развивается, мы считаем полезным дополнить Node.js в задачах, связанных с CPU, с возможностью выполнения JavaScript в нескольких изолятах V8 и общением между ними. Напай.js отображается как модуль Node.js, а также может быть встроен в хост-процесс без зависимости от Node.js. "
Если вы используете Rx, довольно просто подключиться к rxjs-кластеру, чтобы разделить работу на параллельное выполнение. (отказ от ответственности: я автор)
Также есть https://github.com/xk/node-threads-a-gogo, хотя я не уверен в статусе проекта.
Мне нужна реальная многопоточность в Node.js, а для для меня был threads пакет. Он порождает другой процесс, имеющий собственный конвейер сообщений Node.js, поэтому они не блокируют друг друга. Настройка проста, и документация позволяет вам быстро и быстро работать. Ваша основная программа и рабочие могут общаться в обоих направлениях, и рабочие "потоки" могут быть убиты при необходимости.
Поскольку многопоточность и Node.js - сложная и широко обсуждаемая тема, было довольно сложно найти пакет, который работает для моего конкретного требования. Для записи эти не работали для меня:
require
-инг-модули в рабочих, которые мне нужныИ для тех, кто спрашивает, зачем мне нужна настоящая многопоточность: для приложения, в котором используется малина Pi и прерывается. Один поток обрабатывает эти прерывания, а другой берет на себя хранение данных (и более).
NodeJS теперь включает потоки (в качестве экспериментальной функции во время ответа).
Возможно, вы ищете Promise.race
(собственное гоночное решение ввода-вывода, а не потоки)
Предполагая, что вы (или другие, кто ищет этот вопрос) хотите участвовать в гонках, чтобы избежать сбоев и избежать затрат на операции ввода-вывода, это простой и собственный способ выполнить его (который не использует потоки). Node предназначен для однопоточных (поиск цикла событий), поэтому избегайте использования потоков, если это возможно. Если мое предположение верно, я рекомендую использовать Promise.race
с setTimeout
(пример в ссылке). С помощью этой стратегии вы будете участвовать в гонке за списком promises, который каждый пытается выполнить операцию ввода-вывода и отклонит обещание, если есть ошибка (в противном случае - тайм-аут). Оператор Promise.race
продолжается после первого разрешения/отклонения, который, кажется, является тем, что вы хотите. Надеюсь, это поможет кому-то!
Релиз nodejs 10.5.0 анонсировал многопоточность в Node.js. Функция все еще экспериментальная. Теперь доступен новый модуль worker_threads.
Вы можете начать использовать рабочие потоки, если вы запускаете Node.js v10.5.0 или выше, но это экспериментальный API. По умолчанию он недоступен: вам нужно включить его с помощью --experimental-worker при вызове Node.js.
Вот пример с включенными ES6 и worker_threads, протестирован на версии 12.3.1
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
Теперь вам нужно импортировать Worker из worker_threads. Примечание. Для поддержки ES6 необходимо объявить файлы js с расширением ".mjs".
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error('Worker stopped with
exit code ${code}')));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
Наконец, мы создаем workerService.mjs
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage('${workerData} from worker ${threadId}');
Выход:
Npm Run Start
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
Node.js не использует потоки. Согласно его изобретателю, это ключевая особенность. Во время изобретения нити были медленными, проблематичными и сложными. Node.js был создан в результате исследования эффективной одноядерной альтернативы. Большинство энтузиастов Node.js по-прежнему ссылаются на старый аргумент, как если бы потоки не улучшались за последние 50 лет.
Как вы знаете, Node.js используется для запуска JavaScript. На протяжении многих лет язык JavaScript также развивался. Теперь у него есть способы использования нескольких ядер - то есть, что делают Threads. Таким образом, благодаря продвижению в JavaScript вы можете выполнять многозадачную многозадачность в своих приложениях. user158 указывает, что Node.js играет с ним немного. Я ничего не знаю об этом. Но зачем ждать, пока Node.js одобрит, что может предложить JavaScript.
Многопоточность Google for JavaScript вместо многопоточности Node.js. Вы узнаете о Web Workers, Promises и других вещах.