multi-tasks 1.0.7 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,2 +1,39 @@
1
1
  # multi-tasks
2
2
  multi-tasks
3
+
4
+ Install:
5
+
6
+ ```javascript
7
+ npm install multi-tasks
8
+ ```
9
+
10
+ How to use:
11
+
12
+ ```javascript
13
+ let master = require('multi-tasks').master;
14
+ let RunnerProducer;//See examples, please provide a Producer class to specify all tasks you have, multi-tasks will automatically split them and execute them in a multi-threaded manner
15
+ let RunnerConsumer;//See examples, please provide a Consumer class to process a certain sub-task and return the processed data
16
+
17
+ master.start(RunnerProducer, RunnerConsumer, {
18
+ multi_task_parent_folder: `C:/tmp-demo`,
19
+ quotaOfEachTask:2, //The number of tasks assigned to each worker
20
+ numberOfWorks: 6
21
+ });
22
+ ```
23
+
24
+ Have a try:
25
+
26
+ ```shell
27
+ node example0/run
28
+ node example1/run
29
+ ```
30
+
31
+ Changelog:
32
+
33
+ - 1.1.3 Simplified usage, see example0
34
+ - 1.1.2
35
+ - 1.1.1 Rename files, updated changelog
36
+ - 1.1.0 Simplified the usage of a customized Consumer, see example0
37
+ - 1.0.8 Fix examples
38
+ - 1.0.7 Remove moment
39
+ - 1.0.6 Performance optimization
@@ -0,0 +1,18 @@
1
+ let SuperConsumer = require('../index').SuperConsumer;
2
+
3
+ class TestConsumer extends SuperConsumer {
4
+
5
+ process(taskInfo, actionData){
6
+ console.log(`processing data:`, taskInfo, actionData);
7
+ return {
8
+ task:{
9
+ ...taskInfo,
10
+ ...actionData,
11
+ },
12
+ result: {
13
+ message: 'this is a result from a demo, random data=' + Math.random()
14
+ }
15
+ }
16
+ }
17
+ }
18
+ module.exports = TestConsumer;
@@ -0,0 +1,35 @@
1
+ let SuperProducer = require('../index').SuperProducer;
2
+ class TestProducer extends SuperProducer {
3
+
4
+ // constructor
5
+ constructor(taskname, parentfolder) {
6
+ super(taskname, parentfolder)
7
+
8
+ }
9
+ setTaskTrunkInfo(trunkInfo){
10
+ this.trunkInfo = trunkInfo;
11
+ }
12
+ getAllActions() {
13
+ /**
14
+ * Generate all your tasks in this method, return as an array;
15
+ * These data will be allocated to multiple threads (workers) for running;
16
+ * You can obtain each of the data and process it in the 'process' method of your consumer.
17
+ *
18
+ * **/
19
+
20
+ return new Promise((resolve, reject)=>{
21
+ let trunkInfo = this.trunkInfo;
22
+ let alltasks = []
23
+ for(let i=0;i<200;i++){
24
+ let task_props = {
25
+ index: i,
26
+ name: `task-${i}`,
27
+ description: `This prop is for a subtask`
28
+ };
29
+ alltasks.push(task_props);
30
+ }
31
+ resolve(alltasks);//return all your tasks as an array
32
+ })
33
+ }
34
+ }
35
+ module.exports = TestProducer;
@@ -0,0 +1,9 @@
1
+ let RunnerProducer = require('./RunnerProducer');//You need to provide a Producer to return all subtasks, multi-tasks will automatically split them and execute them in a multi-threaded manner
2
+ let RunnerConsumer = require('./RunnerConsumer');//You need to provide a Consumer to process a certain sub-task and return the processed data
3
+ let master = require('../index').master;
4
+
5
+ master.start(RunnerProducer, RunnerConsumer, {
6
+ multi_task_parent_folder: `C:/tmp-demo`,
7
+ quotaOfEachTask:2, //The number of tasks assigned to each worker
8
+ numberOfWorks: 6
9
+ });
@@ -2,10 +2,18 @@ let SuperConsumer = require('../index').SuperConsumer;
2
2
 
3
3
 
4
4
  let _do = (mainTaskInfo, actions, callback)=>{
5
- if(actions.length === 0) return callback({data:'hahaha'+Math.random()});
6
- let act = actions.shift();
5
+ if(actions.length === 0) return callback({
6
+ data:'subtask finished, random data='+Math.random()
7
+ });
8
+ let actionData = actions.shift();
7
9
 
8
- console.log('act', act)
10
+ //start to write your process code here
11
+
12
+ console.log('actionData', actionData)
13
+
14
+ //end of your process code.
15
+
16
+ //trigger next task
9
17
  _do(mainTaskInfo, actions, callback);
10
18
  };
11
19
 
@@ -0,0 +1,35 @@
1
+ let SuperProducer = require('../index').SuperProducer;
2
+ class TestProducer extends SuperProducer {
3
+
4
+ // constructor
5
+ constructor(taskname, parentfolder) {
6
+ super(taskname, parentfolder)
7
+
8
+ }
9
+ setTaskTrunkInfo(trunkInfo){
10
+ this.trunkInfo = trunkInfo;
11
+ }
12
+ getAllActions() {
13
+ /**
14
+ * Generate all your tasks in this method, return as an array;
15
+ * These data will be allocated to multiple threads (workers) for running;
16
+ * You can obtain each of the data and process it in the 'process' method of your consumer.
17
+ *
18
+ * **/
19
+
20
+ return new Promise((resolve, reject)=>{
21
+ let trunkInfo = this.trunkInfo;
22
+ let alltasks = []
23
+ for(let i=0;i<200;i++){
24
+ let task_props = {
25
+ index: i,
26
+ name: `task-${i}`,
27
+ description: `This prop is for a subtask`
28
+ };
29
+ alltasks.push(task_props);
30
+ }
31
+ resolve(alltasks);//return all your tasks as an array
32
+ })
33
+ }
34
+ }
35
+ module.exports = TestProducer;
@@ -1,7 +1,5 @@
1
- let fs = require('fs');
2
- let pathutil = require('path');
3
- let RunnerProducer = require('./RunnerProducer')
4
- let RunnerConsumer = require('./RunnerConsumer')
1
+ let RunnerProducer = require('./RunnerProducer');//switch to require from node_modules in your project
2
+ let RunnerConsumer = require('./RunnerConsumer');//switch to require from node_modules in your project
5
3
 
6
4
  let taskId = Math.random()+'';
7
5
  let multi_task_parent_folder = `C:/tmp-demo`;
@@ -1,5 +1,4 @@
1
1
  let fs = require('fs');
2
- const jsonFormat = require('json-format');
3
2
  let pathutil = require('path');
4
3
  const { spawn, exec } = require('child_process');
5
4
  let SuperConsumer = require('../index').SuperConsumer;
@@ -120,7 +119,7 @@ let _do = (mainTaskInfo, actions, callback)=>{
120
119
  console.log('processing...', process.pid, fpath);
121
120
  processTask(moduleName, requestVersion, (succ, logJson)=>{
122
121
  if(succ){
123
- fs.writeFileSync(succfPath, jsonFormat(logJson));
122
+ fs.writeFileSync(succfPath, JSON.stringify(logJson));
124
123
  logJson.response.forEach((item)=>{
125
124
  if(item.dependencies){
126
125
  for(let module2 in item.dependencies){
@@ -132,7 +131,7 @@ let _do = (mainTaskInfo, actions, callback)=>{
132
131
  });
133
132
  }else{
134
133
  console.log('ERR! failed', moduleName, requestVersion);
135
- fs.writeFileSync(pathutil.resolve(dynamicTasksFolderFail, `${fullnameMd5}.json`), jsonFormat({
134
+ fs.writeFileSync(pathutil.resolve(dynamicTasksFolderFail, `${fullnameMd5}.json`), JSON.stringify({
136
135
  moduleName, requestVersion,
137
136
  msg: logJson
138
137
  }));
@@ -1,7 +1,6 @@
1
1
  let SuperProducer = require('../index').SuperProducer;
2
2
  const fs = require('fs');
3
3
  let pathutil = require('path');
4
- const jsonFormat = require('json-format');
5
4
 
6
5
  let thisroot = pathutil.parse(__filename).dir;
7
6
 
@@ -1,8 +1,8 @@
1
1
  let fs = require('fs');
2
2
  let pathutil = require('path');
3
3
  let makeDir = require('make-dir');
4
- let RunnerProducer = require('./RunnerProducer')
5
- let RunnerConsumer = require('./RunnerConsumer')
4
+ let RunnerProducer = require('./RunnerProducer');//switch to require from node_modules in your project
5
+ let RunnerConsumer = require('./RunnerConsumer');//switch to require from node_modules in your project
6
6
 
7
7
  let thisroot = pathutil.parse(__filename).dir;
8
8
  let taskId = `workers_of_${Math.random()}`;
@@ -1,7 +1,6 @@
1
1
  const md5 = require('md5');
2
2
  const fs = require('fs');
3
3
  let pathutil = require('path');
4
- const jsonFormat = require('json-format');
5
4
 
6
5
  let getFileName = (moduleName, requestVersion)=>{
7
6
  let fullname = `${moduleName}@${requestVersion}`;
@@ -10,7 +9,7 @@ let getFileName = (moduleName, requestVersion)=>{
10
9
  };
11
10
  let createNewTask = (moduleName, requestVersion, dynamicTasksFolderNew)=>{
12
11
  let fullnameMd5 = getFileName(moduleName, requestVersion);
13
- fs.writeFileSync(pathutil.resolve(dynamicTasksFolderNew, `./${fullnameMd5}.json`), jsonFormat({
12
+ fs.writeFileSync(pathutil.resolve(dynamicTasksFolderNew, `./${fullnameMd5}.json`), JSON.stringify({
14
13
  info:{
15
14
  moduleName,
16
15
  requestVersion,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multi-tasks",
3
- "version": "1.0.7",
3
+ "version": "1.1.3",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "directories": {
@@ -1,18 +1,46 @@
1
1
  let fs = require('fs');
2
2
  let pathutil = require('path');
3
+
3
4
  class SuperConsumer {
4
5
  // constructor
5
6
  constructor(mainid, subid) {
6
7
  this.mainid = mainid;
7
8
  this.subid = subid;
9
+ this.results = [];
10
+ }
11
+
12
+ setTaskTrunkInfo(trunkInfo){
13
+ this.trunkInfo = trunkInfo;
8
14
  }
9
- run (taskInfo, callback){
10
- //rewrite this
11
- let succ = (Math.random()*1000)%3===0?true:false;
12
- let result = {
13
- succ
15
+ _run (mainTaskInfo, subTaskInfo, actions, results, callback){
16
+ if(actions.length === 0) return callback({
17
+ finishedAt: new Date()*1,
18
+ results,
19
+ subTaskInfo
20
+ });
21
+ let taskInfo = {
22
+ mainid: this.mainid,
23
+ subid: this.subid
24
+ };
25
+ let actionData = actions.shift();
26
+
27
+ if(this.process){
28
+ let result = this.process(taskInfo, actionData);//rewrite this method in subclass
29
+ if(result){
30
+ results.push(result);
31
+ }
14
32
  }
15
- callback(result);
33
+
34
+ this._run(mainTaskInfo, subTaskInfo, actions, results, callback);
35
+ };
36
+ run (mainTaskInfo, subTaskInfo, taskInfo, callback){
37
+ let results = [];
38
+ let actions = subTaskInfo.actions;
39
+ mainTaskInfo.defination = this.trunkInfo.defination;
40
+ this._run(mainTaskInfo, subTaskInfo, actions, results, (result)=>{
41
+ callback(result)
42
+ })
43
+
16
44
  }
17
45
  runTasks (mainTaskInfo, subTaskInfo, message){
18
46
  // console.log(`mainTaskInfo:`, mainTaskInfo)
package/workers/master.js CHANGED
@@ -3,7 +3,6 @@ var pathutil = require('path');
3
3
  const cluster = require('cluster');
4
4
  const numCPUs = require('os').cpus().length;
5
5
 
6
-
7
6
  let MSG_REQUEST_TASKID = 'request_taskid';
8
7
  /**
9
8
  * masterId, the id of scanning flow
@@ -141,7 +140,26 @@ let run = (currentProducer, currentConsumer, opt)=>{
141
140
  worker.send(MSG_REQUEST_TASKID);//request new task
142
141
 
143
142
  }
143
+ };
144
+ let start = (ProducerClass, ConsumerClass, taskConfig)=>{
145
+ let taskId = Math.random()+'';
146
+ let {multi_task_parent_folder} = taskConfig;
147
+
148
+ let producer = new ProducerClass(`workers_of_${taskId}`, multi_task_parent_folder)
149
+ let consumer = new ConsumerClass();
150
+
151
+ console.log(producer.getTaskName())
152
+ //return;
153
+
154
+ //console.log(resp)
155
+ producer.setTaskTrunkInfo(taskConfig);
156
+ consumer.setTaskTrunkInfo(taskConfig);
157
+ run(producer, consumer, {
158
+ quotaOfEachTask:2,
159
+ numberOfWorks: 6
160
+ });
144
161
  }
145
162
  module.exports = {
146
- run
163
+ run,
164
+ start
147
165
  };
@@ -1,29 +0,0 @@
1
- let SuperProducer = require('../index').SuperProducer;
2
- class TestProducer extends SuperProducer {
3
-
4
- // constructor
5
- constructor(taskname, parentfolder) {
6
- super(taskname, parentfolder)
7
-
8
- }
9
- setTaskTrunkInfo(trunkInfo){
10
- this.trunkInfo = trunkInfo;
11
- }
12
- getAllActions() {
13
-
14
- return new Promise((resolve, reject)=>{
15
- let trunkInfo = this.trunkInfo;
16
- //console.log(this.trunkInfo)
17
- //throw repos.length+'ff'+repos2.length
18
- //here, IGNORED_repoRegexStringList
19
- let alltasks = []
20
- for(let i=0;i<200;i++){
21
- alltasks.push({
22
- num:i
23
- })
24
- }
25
- resolve(alltasks);
26
- })
27
- }
28
- }
29
- module.exports = TestProducer;