Skip to content

Instantly share code, notes, and snippets.

@nanpx
Last active January 13, 2020 19:49
Show Gist options
  • Save nanpx/aeb5b577e6ac9bda92ea69789fd796a8 to your computer and use it in GitHub Desktop.
Save nanpx/aeb5b577e6ac9bda92ea69789fd796a8 to your computer and use it in GitHub Desktop.
node-dbus worker threads

dbus Worker Threads Demo

This gist is working through the issue of getting the dbus npm package to work with Node.js worker threads, specifically on node v12.13.0.

To run:

npm install
npm run demo
# run the same demo
# using cluster instead
# of worker threads
npm run demo:cluster
# npm run demo result

> @1.0.0 demo <path>
> node index.js

[worker online]
[worker error] Error: Module did not self-register.
    at Object.Module._extensions..node (internal/modules/cjs/loader.js:1003:18)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
    at Module.require (internal/modules/cjs/loader.js:849:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (<path>/node_modules/dbus/lib/dbus.js:3:13)
    at Module._compile (internal/modules/cjs/loader.js:956:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
    at Module.load (internal/modules/cjs/loader.js:812:32)
    at Function.Module._load (internal/modules/cjs/loader.js:724:14)
[worker exit] 1

# -----

# npm run demo expected result

> @1.0.0 demo /tmp/dbus
> node index.js

[worker online]
[worker received payload] test message
[master received payload] test message
[worker exit] 1
(() => {
'use strict';
const dbus = require('dbus');
const cluster = require('cluster')
const {isMaster, isWorker} = cluster;
if (isMaster) {
const worker = cluster.fork();
worker.on('online', () => {
console.log('[worker online]');
});
worker.on('message', (...args) => {
console.log('[master received payload]', ...args);
worker.kill('SIGTERM');
});
worker.on('error', (err) => {
console.error('[worker error]', err);
});
worker.on('exit', () => {
console.log('[worker exit]');
});
worker.send('test message');
} else if(isWorker) {
process.once('message', (...args) => {
console.log('[worker recieved payload]', ...args);
process.send(...args);
});
}
})();
(() => {
'use strict';
const dbus = require('dbus');
const {isMainThread, parentPort, Worker} = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('online', () => {
console.log('[worker online]');
});
worker.on('message', (...args) => {
console.log('[master received payload]', ...args);
worker.terminate();
});
worker.on('error', (err) => {
console.error('[worker error]', err);
});
worker.on('exit', (code) => {
console.log('[worker exit]', code);
});
worker.postMessage('test message');
} else {
parentPort.once('message', (...args) => {
console.log('[worker received payload]', ...args);
parentPort.postMessage(...args);
});
}
})();
{
"private": true,
"version": "1.0.0",
"main": "index.js",
"scripts": {
"demo": "node index.js",
"demo:cluster": "node cluster.js"
},
"dependencies": {
"dbus": "^1.0.5"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment