Узел, являющийся однопоточным, является распространенным заблуждением. Правда гораздо сложнее. Хотя цикл событий узла является однопоточным, некоторые функции, включенные в стандартную библиотеку Node, не являются однопоточными.
Некоторые из функций, включенных в Node, которые мы запускаем, выполняются вне цикла событий и, следовательно, вне этого отдельного потока.
Таким образом, большая часть кода, который мы пишем в Node, не выполняется полностью внутри одного потока.
Вы можете проверить это на себе, написав код, который дает вам реальное доказательство того, что не весь Node действительно однопоточный, путем реализации функции pbkdf2
из модуля crypto
.
Вы можете сравнить, сколько времени занимает выполнение функции pbkdf2
, чтобы получить представление о том, как многопоточность и пулы потоков на самом деле работают на вашем компьютере. Таким образом, вы можете создавать различные pbkdf2
функции для представления потоков. Функция будет выполнять некоторую дорогостоящую работу, и вы можете протестировать ее и использовать для определения того, является ли Node однопоточным, например:
const crypto = require('crypto');
const start = Date.now();
crypto.pbkdf2('a', 'b', 100000, 512, 'sha512', () => {
console.log('1:', Date.now() - start);
});
Для запуска этой функции требуется довольно много времени, около 1 секунды в большинстве MacBook Pro середины 2015 года.
Таким образом, приведенная выше функция обратного вызова вычисляет хэш, который опять же с машиной, указанной выше, должен выполняться не более 1 секунды, но то, что делает функция, не так важно, как время, необходимое для ее выполнения на вашей машине.
Вы можете добавить дополнительные вызовы функций для представления большего количества потоков, а также настроить размер пула потоков в пуле потоков вашей машины, например process.env.UV_THREADPOOL_SIZE = 2;
.
person
Daniel
schedule
19.02.2019