From 218deb994798f7687e4cd866273392fef480c017 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Sun, 29 Jan 2017 23:41:26 +0100 Subject: [PATCH] add basic functionality --- dist/index.d.ts | 1 + dist/index.js | 3 ++- dist/smartipc.classes.pool.d.ts | 5 +++++ dist/smartipc.classes.pool.js | 12 +++++++++++ dist/smartipc.classes.thread.d.ts | 6 ++++++ dist/smartipc.classes.thread.js | 30 +++++++++++++++++++++++---- dist/smartipc.pool.d.ts | 0 dist/smartipc.pool.js | 1 - test/child.js | 4 ++-- test/child.ts | 2 +- test/test.js | 19 ++++++++++++++++- test/test.ts | 19 +++++++++++++++++ ts/index.ts | 1 + ts/smartipc.classes.pool.ts | 11 ++++++++++ ts/smartipc.classes.thread.ts | 34 +++++++++++++++++++++++++++---- ts/smartipc.pool.ts | 0 16 files changed, 134 insertions(+), 14 deletions(-) create mode 100644 dist/smartipc.classes.pool.d.ts create mode 100644 dist/smartipc.classes.pool.js delete mode 100644 dist/smartipc.pool.d.ts delete mode 100644 dist/smartipc.pool.js create mode 100644 ts/smartipc.classes.pool.ts delete mode 100644 ts/smartipc.pool.ts diff --git a/dist/index.d.ts b/dist/index.d.ts index 8e25055..51a98d5 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,2 +1,3 @@ export * from './smartipc.classes.thread'; export * from './smartipc.classes.threadfunction'; +export * from './smartipc.classes.pool'; diff --git a/dist/index.js b/dist/index.js index a152734..9ebc36b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4,4 +4,5 @@ function __export(m) { } __export(require("./smartipc.classes.thread")); __export(require("./smartipc.classes.threadfunction")); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0NBQXlDO0FBQ3pDLHVEQUFpRCJ9 \ No newline at end of file +__export(require("./smartipc.classes.pool")); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0NBQXlDO0FBQ3pDLHVEQUFpRDtBQUNqRCw2Q0FBdUMifQ== \ No newline at end of file diff --git a/dist/smartipc.classes.pool.d.ts b/dist/smartipc.classes.pool.d.ts new file mode 100644 index 0000000..fcd189f --- /dev/null +++ b/dist/smartipc.classes.pool.d.ts @@ -0,0 +1,5 @@ +export declare class Pool { + pool: any; + constructor(); + run(workerPathArg: string): any; +} diff --git a/dist/smartipc.classes.pool.js b/dist/smartipc.classes.pool.js new file mode 100644 index 0000000..b3b3941 --- /dev/null +++ b/dist/smartipc.classes.pool.js @@ -0,0 +1,12 @@ +"use strict"; +const plugins = require("./smartipc.plugins"); +class Pool { + constructor() { + this.pool = new plugins.threads.Pool(); + } + run(workerPathArg) { + return this.pool.run(workerPathArg); + } +} +exports.Pool = Pool; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpcGMuY2xhc3Nlcy5wb29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRpcGMuY2xhc3Nlcy5wb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4Q0FBNkM7QUFFN0M7SUFFSTtRQUNJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzFDLENBQUM7SUFDRCxHQUFHLENBQUMsYUFBcUI7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7Q0FDSjtBQVJELG9CQVFDIn0= \ No newline at end of file diff --git a/dist/smartipc.classes.thread.d.ts b/dist/smartipc.classes.thread.d.ts index c8c544b..8665ac4 100644 --- a/dist/smartipc.classes.thread.d.ts +++ b/dist/smartipc.classes.thread.d.ts @@ -1,10 +1,16 @@ +import { Pool } from './smartipc.classes.pool'; export declare let setWorkerBasePath: (basePathArg: string) => void; export declare class Thread { thread: any; + workerPath: string; + running: boolean; + assignedPool: Pool; constructor(filePathArg: string); /** * sends a message to the spawned process */ send(message: any): Promise; kill(): void; + assignToPool(poolArg: Pool): void; + private checkSpawn(); } diff --git a/dist/smartipc.classes.thread.js b/dist/smartipc.classes.thread.js index 6a047bc..3105a47 100644 --- a/dist/smartipc.classes.thread.js +++ b/dist/smartipc.classes.thread.js @@ -10,23 +10,45 @@ exports.setWorkerBasePath = (basePathArg) => { }; class Thread { constructor(filePathArg) { - this.thread = plugins.threads.spawn(filePathArg); + this.running = false; + this.assignedPool = null; + this.workerPath = filePathArg; } /** * sends a message to the spawned process */ send(message) { let done = q.defer(); - this.thread.send(message).on('message', (message) => { + this.checkSpawn(); + this.thread.send(message); + this.thread.on('message', (message) => { done.resolve(message); - }).on('error', err => { + }); + this.thread.on('done', (job, message) => { + done.resolve(message); + }); + this.thread.on('error', err => { done.reject(err); }); return done.promise; } kill() { this.thread.kill(); + this.running = false; + } + assignToPool(poolArg) { + this.assignedPool = poolArg; + } + checkSpawn() { + if (!this.running && !this.assignedPool) { + this.running = true; + this.thread = plugins.threads.spawn(this.workerPath); + } + else if (!this.running && this.assignedPool) { + this.running = true; + this.thread = this.assignedPool.run(this.workerPath); + } } } exports.Thread = Thread; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpcGMuY2xhc3Nlcy50aHJlYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGlwYy5jbGFzc2VzLnRocmVhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOENBQTZDO0FBQzdDLDRCQUEyQjtBQUVoQixRQUFBLGlCQUFpQixHQUFHLENBQUMsV0FBbUI7SUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLFFBQVEsRUFBRTtZQUNOLElBQUksRUFBRSxXQUFXO1NBQ3BCO0tBQ0osQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQ7SUFFSSxZQUFZLFdBQW1CO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFJLE9BQVk7UUFDaEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFVO1lBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHO1lBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNwQixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUN0QixDQUFDO0NBQ0o7QUF0QkQsd0JBc0JDIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpcGMuY2xhc3Nlcy50aHJlYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydGlwYy5jbGFzc2VzLnRocmVhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOENBQTZDO0FBQzdDLDRCQUEyQjtBQUloQixRQUFBLGlCQUFpQixHQUFHLENBQUMsV0FBbUI7SUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLFFBQVEsRUFBRTtZQUNOLElBQUksRUFBRSxXQUFXO1NBQ3BCO0tBQ0osQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQ7SUFLSSxZQUFZLFdBQW1CO1FBRi9CLFlBQU8sR0FBWSxLQUFLLENBQUE7UUFDeEIsaUJBQVksR0FBUyxJQUFJLENBQUE7UUFFckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUE7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFJLE9BQVk7UUFDaEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFVO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBVTtZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUc7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNwQixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUN4QixDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWE7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUE7SUFDL0IsQ0FBQztJQUVPLFVBQVU7UUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN4RCxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBOUNELHdCQThDQyJ9 \ No newline at end of file diff --git a/dist/smartipc.pool.d.ts b/dist/smartipc.pool.d.ts deleted file mode 100644 index e69de29..0000000 diff --git a/dist/smartipc.pool.js b/dist/smartipc.pool.js deleted file mode 100644 index 8d2cf53..0000000 --- a/dist/smartipc.pool.js +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRpcGMucG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0aXBjLnBvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9 \ No newline at end of file diff --git a/test/child.js b/test/child.js index 15e3fe5..048a843 100644 --- a/test/child.js +++ b/test/child.js @@ -2,6 +2,6 @@ require("typings-global"); require("smartq"); module.exports = (input, done) => { - done('hi'); + done(input); }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLGtCQUFlO0FBQ2YsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJO0lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUNkLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQXVCO0FBQ3ZCLGtCQUFlO0FBQ2YsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJO0lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNmLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/test/child.ts b/test/child.ts index eb5384b..fa2dad4 100644 --- a/test/child.ts +++ b/test/child.ts @@ -1,5 +1,5 @@ import 'typings-global' import 'smartq' module.exports = (input, done) => { - done('hi') + done(input) } diff --git a/test/test.js b/test/test.js index d7b55c7..cf2353d 100644 --- a/test/test.js +++ b/test/test.js @@ -3,6 +3,7 @@ require("typings-test"); const smartipc = require("../dist/index"); let testThreadFunction; let testThread; +let testPool; describe('smartipc', function () { it('should create an instance of ThreadFunction', function () { testThreadFunction = new smartipc.ThreadFunction((input, done) => { @@ -22,5 +23,21 @@ describe('smartipc', function () { testThread.kill(); }); }); + it('should not spawn when nothing is sent', function () { + smartipc.setWorkerBasePath(__dirname); + let testThread = new smartipc.Thread('child.js'); + }); + it('should run in a Pool', function () { + let testPool = new smartipc.Pool(); + let testThread = new smartipc.Thread('child.js'); + testThread.assignToPool(testPool); + testThread.send('what').then(message => { + console.log(message); + testThread.send('another').then(message => { + console.log(message); + testThread.assignedPool.pool.killAll(); + }); + }); + }); }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUVyQiwwQ0FBeUM7QUFFekMsSUFBSSxrQkFBMkMsQ0FBQTtBQUMvQyxJQUFJLFVBQTJCLENBQUE7QUFFL0IsUUFBUSxDQUFDLFVBQVUsRUFBQztJQUNoQixFQUFFLENBQUMsNkNBQTZDLEVBQUM7UUFDN0Msa0JBQWtCLEdBQUcsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUk7WUFDekQsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDMUIsQ0FBQyxDQUFDLENBQUE7UUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFBO1FBQzdCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMscUNBQXFDLEVBQUM7UUFDckMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3JDLFVBQVUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDcEIsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUVyQiwwQ0FBeUM7QUFFekMsSUFBSSxrQkFBMkMsQ0FBQTtBQUMvQyxJQUFJLFVBQTJCLENBQUE7QUFDL0IsSUFBSSxRQUF1QixDQUFBO0FBRTNCLFFBQVEsQ0FBQyxVQUFVLEVBQUM7SUFDaEIsRUFBRSxDQUFDLDZDQUE2QyxFQUFDO1FBQzdDLGtCQUFrQixHQUFHLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJO1lBQ3pELElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzFCLENBQUMsQ0FBQyxDQUFBO1FBQ0Ysa0JBQWtCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLHFDQUFxQyxFQUFDO1FBQ3JDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQyxVQUFVLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzVDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHVDQUF1QyxFQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQyxJQUFJLFVBQVUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDcEQsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUMsc0JBQXNCLEVBQUU7UUFDdkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ2hELFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BCLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3BCLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQzFDLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQyxDQUFBIn0= \ No newline at end of file diff --git a/test/test.ts b/test/test.ts index 85e2907..938e8dc 100644 --- a/test/test.ts +++ b/test/test.ts @@ -4,6 +4,7 @@ import * as smartipc from '../dist/index' let testThreadFunction: smartipc.ThreadFunction let testThread: smartipc.Thread +let testPool: smartipc.Pool describe('smartipc',function(){ it('should create an instance of ThreadFunction',function(){ @@ -24,4 +25,22 @@ describe('smartipc',function(){ testThread.kill() }) }) + + it('should not spawn when nothing is sent',function(){ + smartipc.setWorkerBasePath(__dirname) + let testThread = new smartipc.Thread('child.js') + }) + + it('should run in a Pool', function() { + let testPool = new smartipc.Pool() + let testThread = new smartipc.Thread('child.js') + testThread.assignToPool(testPool) + testThread.send('what').then(message => { + console.log(message) + testThread.send('another').then(message => { + console.log(message) + testThread.assignedPool.pool.killAll() + }) + }) + }) }) diff --git a/ts/index.ts b/ts/index.ts index f7a83d8..25c37c0 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,2 +1,3 @@ export * from './smartipc.classes.thread' export * from './smartipc.classes.threadfunction' +export * from './smartipc.classes.pool' diff --git a/ts/smartipc.classes.pool.ts b/ts/smartipc.classes.pool.ts new file mode 100644 index 0000000..96ce906 --- /dev/null +++ b/ts/smartipc.classes.pool.ts @@ -0,0 +1,11 @@ +import * as plugins from './smartipc.plugins' + +export class Pool { + pool + constructor() { + this.pool = new plugins.threads.Pool() + } + run(workerPathArg: string) { + return this.pool.run(workerPathArg) + } +} diff --git a/ts/smartipc.classes.thread.ts b/ts/smartipc.classes.thread.ts index ab0c1df..3d8daaf 100644 --- a/ts/smartipc.classes.thread.ts +++ b/ts/smartipc.classes.thread.ts @@ -1,6 +1,8 @@ import * as plugins from './smartipc.plugins' import * as q from 'smartq' +import { Pool } from './smartipc.classes.pool' + export let setWorkerBasePath = (basePathArg: string) => { plugins.threads.config.set({ basepath: { @@ -11,8 +13,11 @@ export let setWorkerBasePath = (basePathArg: string) => { export class Thread { thread + workerPath: string + running: boolean = false + assignedPool: Pool = null constructor(filePathArg: string) { - this.thread = plugins.threads.spawn(filePathArg) + this.workerPath = filePathArg } /** @@ -20,9 +25,15 @@ export class Thread { */ send(message: any): Promise { let done = q.defer() - this.thread.send(message).on('message', (message: T) => { + this.checkSpawn() + this.thread.send(message) + this.thread.on('message', (message: T) => { done.resolve(message) - }).on('error', err => { + }) + this.thread.on('done', (job, message: T) => { + done.resolve(message) + }) + this.thread.on('error', err => { done.reject(err) }) return done.promise @@ -30,5 +41,20 @@ export class Thread { kill() { this.thread.kill() + this.running = false } -} \ No newline at end of file + + assignToPool(poolArg: Pool) { + this.assignedPool = poolArg + } + + private checkSpawn() { + if (!this.running && !this.assignedPool) { + this.running = true + this.thread = plugins.threads.spawn(this.workerPath) + } else if (!this.running && this.assignedPool) { + this.running = true + this.thread = this.assignedPool.run(this.workerPath) + } + } +} diff --git a/ts/smartipc.pool.ts b/ts/smartipc.pool.ts deleted file mode 100644 index e69de29..0000000