2017-01-25 3 views
6

Я пытаюсь использовать node-unfluff, который извлекает содержимое из строк HTML. Однако для запуска обычно требуется ~ 200 мс. Поскольку он работает синхронно, это слишком медленно. Я хочу запустить его асинхронно.Веб-работники против child_process для функций интенсивного использования ЦП в Node.js

Насколько я знаю, мои варианты являются Веб-работниками (https://github.com/audreyt/node-webworker-threads) или child_process (https://nodejs.org/api/child_process.html). Есть ли другие варианты?

Если нет, то какой из них лучше с точки зрения скорости или других факторов?

Edit:

Там также Темы à Gogo (https://github.com/xk/node-threads-a-gogo) и крошечным работник (https://github.com/avoidwork/tiny-worker).

Темы для WebWorker не поддерживают require, так что это больше не вариант.

require Файлы с помощью Threads à gogo с помощью своей функции load, но это похоже на хакерское обходное решение.

На данный момент у крошечного работника только 26 звезд в Github, поэтому я не решаюсь использовать его в производственном коде. Он поддерживает require.

Я рассматриваю возможность создания собственной реализации WebWorker с использованием child_process, если нет лучших вариантов.

+0

Можете ли вы объяснить ваш случай использования немного больше? Вы пытаетесь получить параллелизм при обработке нескольких URL-адресов или пытаетесь каким-то образом повысить производительность в узле-unluff? Как вы предполагали использовать дочерние процессы, когда вы зависите от библиотеки в узле? Почему стандартная кластеризация узлов не является опцией в вашем списке (имея в виду, что она действительно полагается на дочерние процессы)? – SylonZero

+0

Я использую узел как сервер. Если для выполнения функции требуется 200 мс, ни один пользователь не может получить ответ сервера в 200 мс. Я хочу сделать его асинхронным, чтобы сервер не был заблокирован. Я могу использовать 'child_process' для запуска другого процесса узла. Я никогда раньше не использовал кластер Node, но я понимаю, что он создает сервер для каждого ядра. Если на каждом ядре запущен 'node-unfluff', то каждый сервер блокируется. –

+0

Хорошо, ваш вопрос начинает становиться яснее. Однако, даже если экземпляр функции (с использованием node-unfluff) является синхронным, это не предотвращает запуск других экземпляров для других запросов к Node. Таким образом, одному пользователю может потребоваться 200 мс, но это обычно не означает, что запросы для * других * пользователей не могут быть запущены.Вы протестировали и обнаружили, что использование этого несвязанного модуля фактически блокирует одновременные запросы? – SylonZero

ответ

1

Вы можете использовать запрос с работниками. В вашем Worker сценарии вам необходимо позвонить

self.importScripts('../path/require.js'); 

В соответствии требуют документы вы можете передать объект конфигурации в модуль:

requirejs.config({ 
    //By default load any module IDs from js/lib 
    baseUrl: 'js/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
}); 

Собираем вместе

работник. js

self.importScripts('../path/require.js'); 
requirejs.config({ 
    //By default load any module IDs from path/lib 
    baseUrl: 'path/lib', 
    //except, if the module ID starts with "app", 
    //load it from the js/app directory. paths 
    //config is relative to the baseUrl, and 
    //never includes a ".js" extension since 
    //the paths config could be for a directory. 
    paths: { 
     app: '../app' 
    } 
}); 

// Start the main app logic. 
requirejs(['jquery', 'canvas', 'app/sub'], 
function ($,  canvas, sub) { 
    //jQuery, canvas and the app/sub module are all 
    //loaded and can be used here now. 
    // now you can post a message back to your callee script to let it know require has loaded 
    self.postMessage("initialized"); 
}); 

self.onmessage = function(message) { 
    // do cpu intensive work here, this example is not cpu intensive... 
    if(message.data === 'to process') { 
     self.postMessage("completed!"); 
    } 
} 

Узел Рабочий вызов

var worker = new Worker('Worker.js'); 
worker.onmessage = function(event) { 
    var msg = event.data; 
    if(msg === 'initialized') { 
     worker.postMessage({data: 'to process'}); 
    } 
}