Правильно ли мое концептуальное недопонимание асинхронности узлов?
Я играю с Node.js в качестве драйвера для оптимизации JavaScript во время сборки.
У меня есть следующий файл Джейка:
fs = require("fs")
uglify = require("uglify-js")
desc "Uglify JS"
bundles =
edit: [ "jquery",.... ]
login: [ ... ]
directory: [ .... ]
all = {}
task "minify", [], (params) ->
files = bundles.edit
for name,files of bundles
all[name] = ""
files.forEach (file, i) ->
file = file + ".js"
all[name] += fs.readFileSync("Src/Scripts/" + file).toString() if file.match(/^.*js$/)
cbgen = (data) ->
(err, out) ->
ast = uglify.parser.parse(data)
ast = uglify.uglify.ast_mangle(ast)
ast = uglify.uglify.ast_squeeze(ast)
fs.write out, uglify.uglify.gen_code(ast), 0, null, null, (e,w) ->
cb = cbgen all[name]
fs.open "Src/Scripts/" + name + ".min.js", "w+", 0666, cb # async methods
и вы можете видеть в последней строке, я сделал дорогую часть сценария асинхронной.
Но когда я запускаю его, он использует только 12% доступной мощности процессора, поэтому два вопроса:
- Я делаю это неправильно
- Если нет, то в чем ее преимущество?
1 ответ
Я не думаю, что ваше понимание нарушено, в этом примере не так уж много положительного. Uglify/js minification сильно зависит от процессора (синтаксический анализ, манипулирование ast и т. Д.), Поэтому я ожидаю, что узел будет эффективно выполнять эти операции последовательно.
Если не ждать, узел будет использовать 100% ЦП, который был выделен. Если вы видите, что он использует около 12%, то ваша машина, вероятно, имеет восемь ядер, и Node занимает одно из них.
Вероятно, в сценарии сборки нет особого смысла, но если вы действительно хотите выполнить это оптимально, вы можете убедиться, что все операции ввода-вывода (в данном случае чтение файлов) выполняются асинхронно, и запустить отдельный процесс для выполнения uglification, чтобы можно было выполнить каждый пакет. в параллели.