2017-01-25 10 views
6

Próbuję użyć node-unfluff, która wyodrębnia zawartość z ciągów HTML. Jednak zwykle trwa to około 200ms. Ponieważ działa synchronicznie, jest to zbyt wolno. Chcę, aby był uruchamiany asynchronicznie.Web Workers vs child_process dla funkcji intensywnie obciążających procesor w Node.js

O ile mi wiadomo, moje opcje to Web Workers (https://github.com/audreyt/node-webworker-threads) lub child_process (https://nodejs.org/api/child_process.html). Czy są inne lepsze opcje?

Jeśli nie, które z nich jest lepsze pod względem szybkości lub innych czynników?

Edit:

Jest też podaje na gogo (https://github.com/xk/node-threads-a-gogo) i malutki pracownika (https://github.com/avoidwork/tiny-worker).

Nici WebWorker nie obsługują require, więc nie jest to już opcja.

Możliwe jest użycie plikówza pomocą Threads à gogo przy użyciu funkcji load, ale wygląda na to, że jest to hacky.

Malutki pracownik ma obecnie tylko 26 gwiazdek na Githubie, więc nie chcę używać go w kodzie produkcyjnym. Obsługuje require.

Rozważam napisanie własnej implementacji WebWorker przy użyciu child_process, jeśli nie ma lepszych opcji.

+0

można wyjaśnić sprawę użyć trochę więcej? Próbujesz uzyskać równoległość przetwarzania wielu adresów URL lub próbujesz w jakiś sposób zwiększyć wydajność w ramach węzła-unfluff? Jak wyobrażałeś sobie używanie procesów potomnych, gdy jesteś zależny od biblioteki w węźle? Dlaczego standardowe klastrowanie węzłów nie jest opcją na liście (pamiętając, że naprawdę polega to na procesach potomnych)? – SylonZero

+0

Używam węzła jako serwera. Jeśli dana funkcja potrzebuje 200ms, żaden użytkownik nie może uzyskać odpowiedzi serwera w ciągu 200ms. Chcę, aby był on asynchroniczny, aby serwer nie był blokowany. Mogę użyć "child_process", aby rozpocząć inny proces Node. Nigdy wcześniej nie korzystałem z klastrowania w węźle, ale rozumiem, że tworzy on serwer dla każdego rdzenia. Jeśli 'node-unfluff' działa na każdym rdzeniu, to każdy serwer jest blokowany. –

+0

OK, twoje pytanie zaczyna być wyraźniejsze. Jednak nawet jeśli instancja funkcji (przy użyciu węzła-unfluff) jest synchroniczna, nie uniemożliwia to wystrzelenia innych instancji dla innych żądań dla węzła. Zatem pojedynczy użytkownik może czekać 200 ms, ale to zwykle nie oznacza, że ​​nie można uruchomić żądań dla * innych * użytkowników.Czy przetestowałeś i okazało się, że za pomocą tego modułu unfluff faktycznie blokuje współbieżne żądania? – SylonZero

Odpowiedz

1

Możesz użyć wymagaj z pracownikami. W skrypcie Worker musisz zadzwonić

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

Zgodnie wymagają dokumenty można przekazać obiekt konfiguracyjny do modułu:

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. 
}); 

wprowadzenie go razem

Worker. 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!"); 
    } 
} 

Węzeł Pracownik połączeń

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