multi-tasks 2.0.3 → 2.0.4
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 +6 -5
- package/examples/example0/run.js +2 -2
- package/package.json +1 -1
- package/test/test_resume/step1_start_and_crash.js +3 -3
- package/test/test_resume/step2_resume.js +4 -3
- package/test/test_resume/test.sh +1 -0
- package/workers/Multithread.js +16 -3
- package/workers/TaskMgr.js +1 -1
- package/workers/asMaster.js +4 -11
- package/workers/helper.js +6 -3
- package/workers/index.js +12 -1
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ let processTask = (task, helper)=>{
|
|
|
30
30
|
return 'a result which is not a promise';
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
//
|
|
33
|
+
//or return a promise
|
|
34
34
|
let processTask = (task, helper)=>{
|
|
35
35
|
let {taskCount} = task;
|
|
36
36
|
|
|
@@ -41,7 +41,7 @@ let processTask = (task, helper)=>{
|
|
|
41
41
|
})
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
//
|
|
44
|
+
//or, dynamically create a new task if find something new while processing
|
|
45
45
|
let processTask = (task, helper)=>{
|
|
46
46
|
let {taskCount} = task;
|
|
47
47
|
|
|
@@ -60,7 +60,7 @@ let processTask = (task, helper)=>{
|
|
|
60
60
|
})
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
//
|
|
63
|
+
//or, this example shows how to generate/handle exceptions
|
|
64
64
|
let processTask = (task, helper)=>{
|
|
65
65
|
let {taskCount} = task;
|
|
66
66
|
|
|
@@ -90,8 +90,8 @@ let processTask = (task, helper)=>{
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
//Step3, run!
|
|
93
|
-
multiTasks
|
|
94
|
-
|
|
93
|
+
multiTasks({
|
|
94
|
+
initialTasks: alltasks,
|
|
95
95
|
processTask,
|
|
96
96
|
taskRootFolder: `../examples-tmp-data/example0`, //a directory to store progress and results files, you can check the progress here
|
|
97
97
|
taskId: 'my-task',
|
|
@@ -116,6 +116,7 @@ node examples/example1/run
|
|
|
116
116
|
|
|
117
117
|
Changelog:
|
|
118
118
|
|
|
119
|
+
- 2.0.4 Support resume from a failed task
|
|
119
120
|
- 2.0.3 Fix: mkdir bug on windows
|
|
120
121
|
- 2.0.2 new feature: support shouldTerminate
|
|
121
122
|
- 2.0.1 Avoid possible I/O conflicts.
|
package/examples/example0/run.js
CHANGED
|
@@ -40,8 +40,8 @@ let processTask = (task, helper)=>{
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
//Step3, run!
|
|
43
|
-
multiTasks
|
|
44
|
-
|
|
43
|
+
multiTasks({
|
|
44
|
+
initialTasks: alltasks,
|
|
45
45
|
processTask,
|
|
46
46
|
taskRootFolder: `../examples-tmp-data/example0`, //a directory to store progress and results files, you can check the progress here
|
|
47
47
|
taskId: 'my-task',
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@ let multiTasks = require('../../index').multiTasks;
|
|
|
2
2
|
|
|
3
3
|
//Step1, If you have tasks that need to be executed simultaneously, please provide them as an array, multi-tasks will automatically split them and execute.
|
|
4
4
|
let alltasks = [];
|
|
5
|
-
for(let i=0;i<
|
|
5
|
+
for(let i=0;i<1000;i++){
|
|
6
6
|
let task_props = {
|
|
7
7
|
index: i,
|
|
8
8
|
name: `task-${i}`,
|
|
@@ -40,8 +40,8 @@ let processTask = (task, helper)=>{
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
//Step3, run!
|
|
43
|
-
multiTasks
|
|
44
|
-
|
|
43
|
+
multiTasks({
|
|
44
|
+
initialTasks: alltasks,
|
|
45
45
|
processTask,
|
|
46
46
|
taskRootFolder: `./tmp`, //a directory to store progress and results files, you can check the progress here
|
|
47
47
|
taskId: 'test_resume',
|
|
@@ -7,10 +7,11 @@ let processTask = (task, helper)=>{
|
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
//Step3, run!
|
|
10
|
-
multiTasks
|
|
10
|
+
multiTasks({
|
|
11
11
|
processTask,
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
taskRootFolder: `./tmp`, //a directory to store progress and results files, you can check the progress here
|
|
13
|
+
taskId: 'test_resume',
|
|
14
|
+
numberOfWorkers: 11, //Assign how many workers are working in parallel
|
|
14
15
|
//autoCloseAfterCompletion: true,
|
|
15
16
|
shouldTerminate:(info)=>{
|
|
16
17
|
//if(info.taskCount > 30) return true;
|
package/test/test_resume/test.sh
CHANGED
package/workers/Multithread.js
CHANGED
|
@@ -5,6 +5,7 @@ const numCPUs = require('os').cpus().length;
|
|
|
5
5
|
|
|
6
6
|
let MSG_REQUEST_NEW_TASK = 'request_new_task';
|
|
7
7
|
let MSG_NO_TASK_FOUND = 'no_task_found';
|
|
8
|
+
let MSG_SET_GLOBAL_PARAMS = 'MSG_SET_GLOBAL_PARAMS';
|
|
8
9
|
|
|
9
10
|
const asMaster = require('./asMaster');
|
|
10
11
|
const TaskMgr = require('./TaskMgr');
|
|
@@ -104,7 +105,10 @@ const start = (config)=>{
|
|
|
104
105
|
}
|
|
105
106
|
});
|
|
106
107
|
});
|
|
107
|
-
}
|
|
108
|
+
}else
|
|
109
|
+
if(message.MSG_SET_GLOBAL_PARAMS){
|
|
110
|
+
console.log('xxxxxxxxxxxxxxxxxxxxxxxxxx', message)
|
|
111
|
+
}
|
|
108
112
|
});
|
|
109
113
|
}
|
|
110
114
|
});
|
|
@@ -149,7 +153,10 @@ function subWorker(){
|
|
|
149
153
|
subTask.index = taskCount;//for v1 backward
|
|
150
154
|
subTask.taskCount = taskCount;
|
|
151
155
|
console.log(`[Task Start]: "${subTask.subid}"`, `pid=${process.pid}`, getDateTimeTxt());
|
|
152
|
-
|
|
156
|
+
let sendMsg = (msg)=>{
|
|
157
|
+
worker.send(msg);
|
|
158
|
+
};
|
|
159
|
+
runTask(config, subTask, sendMsg).then((report)=>{
|
|
153
160
|
let endTimestamp = new Date()*1;
|
|
154
161
|
let cost = startTimestamp - endTimestamp;
|
|
155
162
|
|
|
@@ -166,12 +173,18 @@ function subWorker(){
|
|
|
166
173
|
worker.send(MSG_REQUEST_NEW_TASK);//request new task
|
|
167
174
|
|
|
168
175
|
};
|
|
169
|
-
function runTask(config, subTask,
|
|
176
|
+
function runTask(config, subTask, sendMsg){
|
|
170
177
|
return new Promise((resolve)=>{
|
|
171
178
|
let resultPromise = Promise.resolve({});
|
|
172
179
|
let resultData;
|
|
173
180
|
let errors = [];
|
|
174
181
|
helper.load(config);
|
|
182
|
+
helper.setGlobalParams = (params)=>{
|
|
183
|
+
sendMsg({
|
|
184
|
+
MSG_SET_GLOBAL_PARAMS,
|
|
185
|
+
params
|
|
186
|
+
});
|
|
187
|
+
};
|
|
175
188
|
try{
|
|
176
189
|
resultPromise = USER_CONFIG.processTask(subTask, helper);//rewrite this method in subclass
|
|
177
190
|
}catch(e){
|
package/workers/TaskMgr.js
CHANGED
|
@@ -180,7 +180,7 @@ const TaskMgr = {
|
|
|
180
180
|
});
|
|
181
181
|
},
|
|
182
182
|
mvTask: (subid, from, to, callback)=> {
|
|
183
|
-
console.log('Move task:', subid, from
|
|
183
|
+
console.log('Move task:', subid, `${from}>${to}`);
|
|
184
184
|
let {progressRootFolder} = main_config;
|
|
185
185
|
let oldPath = pathutil.resolve(progressRootFolder, `./${from}/${subid}.task.json`);
|
|
186
186
|
let newPath = pathutil.resolve(progressRootFolder, `./${to}/${subid}.task.json`);
|
package/workers/asMaster.js
CHANGED
|
@@ -23,14 +23,8 @@ const getDateTimeTxt = ()=>{
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
const resume = (config)=>{
|
|
26
|
-
let {
|
|
27
|
-
|
|
28
|
-
console.log('[ERROR]', 'method resume need param "taskFolder"')
|
|
29
|
-
throw ('[ERROR]', 'method resume need param "taskFolder"');
|
|
30
|
-
}
|
|
31
|
-
let pathinfo = pathUtil.parse(taskFolder);
|
|
32
|
-
let taskId = pathinfo.name;
|
|
33
|
-
let taskRootFolder = pathinfo.dir;
|
|
26
|
+
let {taskRootFolder, taskId} = config;
|
|
27
|
+
let taskFolder = pathUtil.resolve(taskRootFolder, taskId);
|
|
34
28
|
|
|
35
29
|
//load from config file
|
|
36
30
|
let task_config = JSON.parse(fs.readFileSync(pathUtil.resolve(taskFolder, 'task_config.json')));
|
|
@@ -75,9 +69,8 @@ const resume = (config)=>{
|
|
|
75
69
|
|
|
76
70
|
const init = (config)=>{
|
|
77
71
|
if(typeof config === 'undefined') config = {};
|
|
78
|
-
if(!config.
|
|
72
|
+
if(!config.initialTasks){ throw 'Please provide initialTasks data!'; };
|
|
79
73
|
if(!config.processTask){ throw 'Please provide processTask function!'; };
|
|
80
|
-
if(!config.tasks){ throw 'Must assign initial tasks!'; };
|
|
81
74
|
|
|
82
75
|
if(typeof config.numberOfWorkers === 'undefined') config.numberOfWorkers = numCPUs - 1;
|
|
83
76
|
|
|
@@ -100,7 +93,7 @@ const init = (config)=>{
|
|
|
100
93
|
TaskMgr.load(config);
|
|
101
94
|
config = TaskMgr.initFolders(config);
|
|
102
95
|
|
|
103
|
-
config.
|
|
96
|
+
config.initialTasks.forEach((task)=>{
|
|
104
97
|
TaskMgr.createNewTask(task);
|
|
105
98
|
});
|
|
106
99
|
|
package/workers/helper.js
CHANGED
|
@@ -8,15 +8,18 @@ const load = (config)=>{
|
|
|
8
8
|
myconfig = config;
|
|
9
9
|
};
|
|
10
10
|
const createNewTasks = (tasks)=>{
|
|
11
|
-
|
|
12
11
|
if (!Array.isArray(tasks)) tasks = [tasks];
|
|
13
12
|
TaskMgr.load(myconfig);
|
|
14
13
|
tasks.forEach((task)=>{
|
|
15
|
-
console.log('
|
|
14
|
+
console.log('Creating new task', task)
|
|
16
15
|
TaskMgr.createNewTask(task);
|
|
17
16
|
});
|
|
18
17
|
};
|
|
18
|
+
const setGlobalParams = (params)=>{
|
|
19
|
+
//will be overridden in Multithread
|
|
20
|
+
};
|
|
19
21
|
module.exports = {
|
|
20
22
|
load,
|
|
21
|
-
createNewTasks
|
|
23
|
+
createNewTasks,
|
|
24
|
+
setGlobalParams
|
|
22
25
|
};
|
package/workers/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
1
2
|
const pathUtil = require('path');
|
|
2
3
|
const Multithread = require('./Multithread');
|
|
3
4
|
const backwardv1 = require('../utils/backward-v1');
|
|
@@ -21,6 +22,8 @@ const resume = (config)=>{
|
|
|
21
22
|
config = backwardv1.v1tov2(config);
|
|
22
23
|
config.__resume = true;
|
|
23
24
|
|
|
25
|
+
config.initialTasks = [];
|
|
26
|
+
|
|
24
27
|
config.taskRootFolder = _toAbsPath(config.taskRootFolder);
|
|
25
28
|
config.taskFolder = _toAbsPath(config.taskFolder);
|
|
26
29
|
|
|
@@ -36,7 +39,15 @@ const restart = (config)=>{
|
|
|
36
39
|
};
|
|
37
40
|
|
|
38
41
|
const multiTasks = (config)=>{
|
|
39
|
-
|
|
42
|
+
let {taskRootFolder, taskId} = config;
|
|
43
|
+
let taskFolder = pathUtil.resolve(taskRootFolder, taskId);
|
|
44
|
+
|
|
45
|
+
if(fs.existsSync(taskFolder)){
|
|
46
|
+
resume(config);
|
|
47
|
+
}else{
|
|
48
|
+
start(config);
|
|
49
|
+
}
|
|
50
|
+
|
|
40
51
|
};
|
|
41
52
|
|
|
42
53
|
multiTasks.start = start;
|