I'm trying to use node-unfluff
, which extracts content from HTML strings. However, it usually takes ~200ms to run. Since it runs synchronously, this is way too slow. I want to make it run asynchronously.
As far as I know, my options are Web Workers (https://github.com/audreyt/node-webworker-threads) or child_process
(https://nodejs.org/api/child_process.html). Are there other better options?
If not, which of these is better in terms of speed or other factors?
Edit:
There's also Threads à gogo (https://github.com/xk/node-threads-a-gogo) and tiny-worker (https://github.com/avoidwork/tiny-worker).
WebWorker Threads doesn't support require
, so that's no longer an option.
It's possible to require
files using Threads à gogo by using its load
function, but it seems like a hacky workaround.
tiny-worker has only 26 stars on Github at the moment, so I'm hesitant to use it in production code. It supports require
.
I'm considering writing my own WebWorker implementation using child_process
if there's no better options.
You can use require with Workers. In your Worker script you'll need to call
self.importScripts('../path/require.js');
As per require docs you can pass a config object to a module:
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.
});
Putting it together
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!");
}
}
Node Worker Call
var worker = new Worker('Worker.js');
worker.onmessage = function(event) {
var msg = event.data;
if(msg === 'initialized') {
worker.postMessage({data: 'to process'});
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With