Итак, я выполнял этот код, чтобы проверить количество потоков в пуле потоков, созданном библиотекой libuv:
var fs = require('fs');
var util = require('util');
var sleep = require('sleep');
var start = process.hrtime();
var sample_func = function(callback) {
var i = 0;
sleep.sleep(1);
callback();
}
for (var i = 0; i < 6; ++i) {
(function (id) {
sample_func(function () {
var end = process.hrtime(start);
console.log(util.format('sample func %d finished in %ds', id, end[0] + end[1] / 1e9));
});
})(i);
}
Поскольку libuv по умолчанию создает 4 потока в пуле потоков, а моя примерная функция является асинхронной, я ожидал, что этот вывод будет напечатан в моей консоли:
sample func 0 finished in 1.003170344s
sample func 1 finished in 1.052704191s
sample func 2 finished in 1.058100525s
sample func 3 finished in 1.060514229s
sample func 4 finished in 2.003446385s
sample func 5 finished in 2.007682862s
Таким образом, первые 4 итерации выполняются параллельно, а последние 2 должны ждать завершения первых 4. Однако то, что я получил, было это -
sample func 0 finished in 1.00095422s
sample func 1 finished in 2.056155718s
sample func 2 finished in 3.058480649s
sample func 3 finished in 4.061336076s
sample func 4 finished in 5.063556904s
sample func 5 finished in 6.066219487s
Это означает, что каждая итерация выполняется одна за другой, что занимает в общей сложности 6 секунд. Может ли кто-нибудь помочь мне здесь, почему это происходит?
PS: я напечатал значение process.env.UV_THREADPOOL_SIZE, я получил неопределенное значение; версия узла: v12.9.1
Спасибо
sleep
блоков на секунду, синхронно, на каждой итерации. Не уверен насчет libuv, вам придется вызывать параллельную обработку каким-то другим способом (child_process?) - person CertainPerformance   schedule 27.02.2020