Правильно ли мое концептуальное недопонимание асинхронности узлов? - PullRequest
0 голосов
/ 23 октября 2011

Я играю с Node.js в качестве драйвера для некоторой оптимизации javascript во время сборки.

У меня есть следующий файл Jake:

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. Я делаю это неправильно
  2. Если нет, то гдеверх?

1 Ответ

1 голос
/ 23 октября 2011

Я не думаю, что ваше понимание нарушено, в этом примере не так уж много положительного. Uglify / js minification тесно связана с процессором (синтаксический анализ, манипулирование ast и т. Д.), Поэтому я ожидаю, что узел будет эффективно выполнять эти операции последовательно.

Если не ждать, узел будет использовать 100% ЦП, который был выделен. Если вы видите, что он использует около 12%, то ваша машина, вероятно, имеет восемь ядер, и Node занимает одно из них.

Вероятно, для сценария сборки нет особого смысла, но если вы действительно хотите выполнить его оптимально, вы можете убедиться, что все операции ввода-вывода (в данном случае чтение файлов) выполняются асинхронно, и запустить отдельный процесс для выполнения увеличения, чтобы каждый пакет может быть сделано параллельно.

...