Подтвердить что ты не робот

Как создать потоки в nodejs

Есть ли способ создать потоки для запуска нескольких методов одновременно?

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

4b9b3361

Ответ 1

Каждый процесс node.js является однопоточным по дизайну. Поэтому для получения нескольких потоков вам необходимо иметь несколько процессов (как указывали некоторые другие плакаты, есть также библиотеки, на которые вы можете ссылаться, что даст вам возможность работать с потоками в Node, но таких возможностей не существует без эти библиотеки. См. ответ Shawn Vincent, ссылающийся на https://github.com/audreyt/node-webworker-threads)

Вы можете запускать дочерние процессы из основного процесса, как показано здесь, в документации node.js: http://nodejs.org/api/child_process.html. Примеры довольно хороши на этой странице и довольно прямолинейны.

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

Также смотрите: Node.js на многоядерных машинах

Ответ 3

С узла 10.5 теперь есть поддержка многопоточности, но она экспериментальная. Надеюсь, что это скоро станет стабильным.

Оформить заказ на следующие ресурсы:


Обновление:

Начиная с узла v11.7.0 и далее, вам не нужно использовать флаг --experimental-worker.

Release Note: https://nodejs.org/en/blog/release/v11.7.0/

Ответ 4

Вы можете получить многопоточность, используя Napa.js.

https://github.com/Microsoft/napajs

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

Ответ 5

Если вы используете Rx, довольно просто подключиться к rxjs-кластеру, чтобы разделить работу на параллельное выполнение. (отказ от ответственности: я автор)

https://www.npmjs.com/package/rxjs-cluster

Ответ 7

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

Поскольку многопоточность и Node.js - сложная и широко обсуждаемая тема, было довольно сложно найти пакет, который работает для моего конкретного требования. Для записи эти не работали для меня:

  • tiny-worker разрешали нерестовые работники, но они, похоже, имели один и тот же цикл сообщений (но, возможно, я сделал что-то не так - threads имел больше документации, давая мне уверенность, что она действительно использовала несколько процессов, поэтому я продолжал идти, пока она не сработала).
  • webworker-threads не разрешал require -инг-модули в рабочих, которые мне нужны

И для тех, кто спрашивает, зачем мне нужна настоящая многопоточность: для приложения, в котором используется малина Pi и прерывается. Один поток обрабатывает эти прерывания, а другой берет на себя хранение данных (и более).

Ответ 8

NodeJS теперь включает потоки (в качестве экспериментальной функции во время ответа).

Ответ 9

Возможно, вы ищете Promise.race (собственное гоночное решение ввода-вывода, а не потоки)

Предполагая, что вы (или другие, кто ищет этот вопрос) хотите участвовать в гонках, чтобы избежать сбоев и избежать затрат на операции ввода-вывода, это простой и собственный способ выполнить его (который не использует потоки). Node предназначен для однопоточных (поиск цикла событий), поэтому избегайте использования потоков, если это возможно. Если мое предположение верно, я рекомендую использовать Promise.race с setTimeout (пример в ссылке). С помощью этой стратегии вы будете участвовать в гонке за списком promises, который каждый пытается выполнить операцию ввода-вывода и отклонит обещание, если есть ошибка (в противном случае - тайм-аут). Оператор Promise.race продолжается после первого разрешения/отклонения, который, кажется, является тем, что вы хотите. Надеюсь, это поможет кому-то!

Ответ 10

Релиз 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

Ответ 11

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 и других вещах.