multi-tasks 1.2.7 → 2.0.0
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/LICENSE +21 -21
- package/README.md +137 -97
- package/cmd.js +42 -0
- package/examples/example0/run-readme.js +88 -0
- package/examples/example0/run.js +52 -37
- package/examples/example1/RunnerConsumer.js +25 -25
- package/examples/example1/RunnerProducer.js +34 -34
- package/examples/example1/run.js +8 -8
- package/examples/example2/RunnerConsumer.js +39 -39
- package/examples/example2/RunnerProducer.js +34 -34
- package/examples/example2/run.js +22 -22
- package/examples/example3-dynamicIncreasing/RunnerConsumer.js +175 -175
- package/examples/example3-dynamicIncreasing/RunnerProducer.js +48 -48
- package/examples/example3-dynamicIncreasing/run.js +35 -35
- package/examples/example3-dynamicIncreasing/util.js +45 -45
- package/index.js +3 -36
- package/monitors/cli.js +28 -0
- package/package.json +23 -22
- package/test/splitter.test.js +16 -16
- package/todo.txt +4 -0
- package/utils/asyncQueue.js +32 -0
- package/utils/backward-v1.js +11 -0
- package/utils/makedir.js +55 -24
- package/utils/randoms.js +15 -0
- package/utils/test/test_asyncqueue.js +116 -0
- package/utils/test_makedir.js +2 -2
- package/workers/Multithread.js +175 -0
- package/workers/TaskMgr.js +186 -0
- package/workers/WorkerMgr.js +31 -0
- package/workers/asMaster.js +71 -0
- package/workers/asWorker.js +14 -0
- package/workers/helper.js +22 -0
- package/workers/index.js +8 -0
- package/workers/SuperConsumer.js +0 -106
- package/workers/SuperProducer.js +0 -97
- package/workers/master.js +0 -171
- package/workers/report/report_status.js +0 -52
- package/workers/taskSplitter.js +0 -30
- package/workers/test/MyConsumer.js +0 -25
- package/workers/test/MyProducer.js +0 -26
- package/workers/test/test_master.js +0 -12
- package/workers/test/test_producer.js +0 -4
- package/workers/test/test_splitter.js +0 -7
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
let fs = require('fs');
|
|
2
|
-
let pathutil = require('path');
|
|
3
|
-
let makeDir = require('../utils/makedir');
|
|
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
|
-
|
|
7
|
-
let thisroot = pathutil.parse(__filename).dir;
|
|
8
|
-
let taskId = `workers_of_${Math.random()}`;
|
|
9
|
-
let multi_task_parent_folder = pathutil.resolve(thisroot, `../../example2_dynamicly_increasing`);
|
|
10
|
-
|
|
11
|
-
let producer = new RunnerProducer(taskId, multi_task_parent_folder)
|
|
12
|
-
let consumer = new RunnerConsumer();
|
|
13
|
-
let master = require('../index').master;
|
|
14
|
-
|
|
15
|
-
console.log(producer.getTaskName())
|
|
16
|
-
//return;
|
|
17
|
-
|
|
18
|
-
let NUMBER_OF_WORKS = 5;//LOCK NUMBER OF WORKERS
|
|
19
|
-
|
|
20
|
-
let taskConfig = {
|
|
21
|
-
NUMBER_OF_WORKS,
|
|
22
|
-
dynamicTasksFolderNew: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-NEW`),
|
|
23
|
-
dynamicTasksFolderSucc: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-SUCC`),
|
|
24
|
-
dynamicTasksFolderFail: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-FAIL`),
|
|
25
|
-
}
|
|
26
|
-
makeDir.sync(taskConfig.dynamicTasksFolderNew)
|
|
27
|
-
makeDir.sync(taskConfig.dynamicTasksFolderSucc)
|
|
28
|
-
makeDir.sync(taskConfig.dynamicTasksFolderFail)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
producer.setTaskTrunkInfo(taskConfig);
|
|
32
|
-
consumer.setTaskTrunkInfo(taskConfig)
|
|
33
|
-
master.run(producer, consumer, {
|
|
34
|
-
quotaOfEachTask:1, //<--Lock as one
|
|
35
|
-
numberOfWorkers:NUMBER_OF_WORKS
|
|
1
|
+
let fs = require('fs');
|
|
2
|
+
let pathutil = require('path');
|
|
3
|
+
let makeDir = require('../utils/makedir');
|
|
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
|
+
|
|
7
|
+
let thisroot = pathutil.parse(__filename).dir;
|
|
8
|
+
let taskId = `workers_of_${Math.random()}`;
|
|
9
|
+
let multi_task_parent_folder = pathutil.resolve(thisroot, `../../example2_dynamicly_increasing`);
|
|
10
|
+
|
|
11
|
+
let producer = new RunnerProducer(taskId, multi_task_parent_folder)
|
|
12
|
+
let consumer = new RunnerConsumer();
|
|
13
|
+
let master = require('../index').master;
|
|
14
|
+
|
|
15
|
+
console.log(producer.getTaskName())
|
|
16
|
+
//return;
|
|
17
|
+
|
|
18
|
+
let NUMBER_OF_WORKS = 5;//LOCK NUMBER OF WORKERS
|
|
19
|
+
|
|
20
|
+
let taskConfig = {
|
|
21
|
+
NUMBER_OF_WORKS,
|
|
22
|
+
dynamicTasksFolderNew: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-NEW`),
|
|
23
|
+
dynamicTasksFolderSucc: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-SUCC`),
|
|
24
|
+
dynamicTasksFolderFail: pathutil.resolve(multi_task_parent_folder, `./dynamicTasks-FAIL`),
|
|
25
|
+
}
|
|
26
|
+
makeDir.sync(taskConfig.dynamicTasksFolderNew)
|
|
27
|
+
makeDir.sync(taskConfig.dynamicTasksFolderSucc)
|
|
28
|
+
makeDir.sync(taskConfig.dynamicTasksFolderFail)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
producer.setTaskTrunkInfo(taskConfig);
|
|
32
|
+
consumer.setTaskTrunkInfo(taskConfig)
|
|
33
|
+
master.run(producer, consumer, {
|
|
34
|
+
quotaOfEachTask:1, //<--Lock as one
|
|
35
|
+
numberOfWorkers:NUMBER_OF_WORKS
|
|
36
36
|
});
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
const md5 = require('md5');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
let pathutil = require('path');
|
|
4
|
-
|
|
5
|
-
let getFileName = (moduleName, requestVersion)=>{
|
|
6
|
-
let fullname = `${moduleName}@${requestVersion}`;
|
|
7
|
-
let fullnameMd5 = md5(fullname);
|
|
8
|
-
return fullnameMd5;
|
|
9
|
-
};
|
|
10
|
-
let createNewTask = (moduleName, requestVersion, dynamicTasksFolderNew)=>{
|
|
11
|
-
let fullnameMd5 = getFileName(moduleName, requestVersion);
|
|
12
|
-
fs.writeFileSync(pathutil.resolve(dynamicTasksFolderNew, `./${fullnameMd5}.json`), JSON.stringify({
|
|
13
|
-
info:{
|
|
14
|
-
moduleName,
|
|
15
|
-
requestVersion,
|
|
16
|
-
fullnameMd5,
|
|
17
|
-
}
|
|
18
|
-
}));
|
|
19
|
-
};
|
|
20
|
-
function shuffleAnArray(array) {
|
|
21
|
-
if(array.length === 0 || array.length === 1) return array;
|
|
22
|
-
let currentIndex = array.length, randomIndex;
|
|
23
|
-
|
|
24
|
-
// While there remain elements to shuffle.
|
|
25
|
-
while (currentIndex > 0) {
|
|
26
|
-
|
|
27
|
-
// Pick a remaining element.
|
|
28
|
-
randomIndex = Math.floor(Math.random() * currentIndex);
|
|
29
|
-
currentIndex--;
|
|
30
|
-
|
|
31
|
-
// And swap it with the current element.
|
|
32
|
-
let tmp = array[currentIndex];
|
|
33
|
-
array[currentIndex] = array[randomIndex];
|
|
34
|
-
array[randomIndex] = tmp;
|
|
35
|
-
|
|
36
|
-
// [array[currentIndex], array[randomIndex]] = [
|
|
37
|
-
// array[randomIndex], array[currentIndex]];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return array;
|
|
41
|
-
}
|
|
42
|
-
module.exports = {
|
|
43
|
-
createNewTask,
|
|
44
|
-
getFileName,
|
|
45
|
-
shuffleAnArray
|
|
1
|
+
const md5 = require('md5');
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
let pathutil = require('path');
|
|
4
|
+
|
|
5
|
+
let getFileName = (moduleName, requestVersion)=>{
|
|
6
|
+
let fullname = `${moduleName}@${requestVersion}`;
|
|
7
|
+
let fullnameMd5 = md5(fullname);
|
|
8
|
+
return fullnameMd5;
|
|
9
|
+
};
|
|
10
|
+
let createNewTask = (moduleName, requestVersion, dynamicTasksFolderNew)=>{
|
|
11
|
+
let fullnameMd5 = getFileName(moduleName, requestVersion);
|
|
12
|
+
fs.writeFileSync(pathutil.resolve(dynamicTasksFolderNew, `./${fullnameMd5}.json`), JSON.stringify({
|
|
13
|
+
info:{
|
|
14
|
+
moduleName,
|
|
15
|
+
requestVersion,
|
|
16
|
+
fullnameMd5,
|
|
17
|
+
}
|
|
18
|
+
}));
|
|
19
|
+
};
|
|
20
|
+
function shuffleAnArray(array) {
|
|
21
|
+
if(array.length === 0 || array.length === 1) return array;
|
|
22
|
+
let currentIndex = array.length, randomIndex;
|
|
23
|
+
|
|
24
|
+
// While there remain elements to shuffle.
|
|
25
|
+
while (currentIndex > 0) {
|
|
26
|
+
|
|
27
|
+
// Pick a remaining element.
|
|
28
|
+
randomIndex = Math.floor(Math.random() * currentIndex);
|
|
29
|
+
currentIndex--;
|
|
30
|
+
|
|
31
|
+
// And swap it with the current element.
|
|
32
|
+
let tmp = array[currentIndex];
|
|
33
|
+
array[currentIndex] = array[randomIndex];
|
|
34
|
+
array[randomIndex] = tmp;
|
|
35
|
+
|
|
36
|
+
// [array[currentIndex], array[randomIndex]] = [
|
|
37
|
+
// array[randomIndex], array[currentIndex]];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return array;
|
|
41
|
+
}
|
|
42
|
+
module.exports = {
|
|
43
|
+
createNewTask,
|
|
44
|
+
getFileName,
|
|
45
|
+
shuffleAnArray
|
|
46
46
|
};
|
package/index.js
CHANGED
|
@@ -1,37 +1,4 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const multiTasks = (config)=>{
|
|
5
|
-
if(!config.tasks){
|
|
6
|
-
throw 'Please provide tasks data';
|
|
7
|
-
};
|
|
8
|
-
if(!config.processTask){
|
|
9
|
-
throw 'Please provide processTask function';
|
|
10
|
-
};
|
|
11
|
-
class TestProducer extends SuperProducer {
|
|
12
|
-
// constructor
|
|
13
|
-
setTaskTrunkInfo(trunkInfo){
|
|
14
|
-
this.trunkInfo = trunkInfo;
|
|
15
|
-
}
|
|
16
|
-
getAllActions() {
|
|
17
|
-
return Promise.resolve(config.tasks);//return all your tasks as an array
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
class TestConsumer extends SuperConsumer {
|
|
21
|
-
processTask(taskProp){
|
|
22
|
-
console.log(`processing data:`, taskProp);
|
|
23
|
-
let result = config.processTask(taskProp);
|
|
24
|
-
return Promise.resolve(result);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
master.start(TestProducer, TestConsumer, {
|
|
29
|
-
...config
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
module.exports = {
|
|
33
|
-
SuperProducer,
|
|
34
|
-
SuperConsumer,
|
|
35
|
-
master,
|
|
36
|
-
multiTasks
|
|
1
|
+
const multiTasks = require('./workers');
|
|
2
|
+
module.exports = {
|
|
3
|
+
multiTasks
|
|
37
4
|
}
|
package/monitors/cli.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const cliProgress = require('cli-progress');
|
|
2
|
+
|
|
3
|
+
// create new container
|
|
4
|
+
const multibar = new cliProgress.MultiBar({
|
|
5
|
+
clearOnComplete: false,
|
|
6
|
+
hideCursor: true,
|
|
7
|
+
format: ' {bar} | {filename} | {value}/{total}',
|
|
8
|
+
}, cliProgress.Presets.shades_grey);
|
|
9
|
+
|
|
10
|
+
// add bars
|
|
11
|
+
const b1 = multibar.create(200, 0);
|
|
12
|
+
const b2 = multibar.create(1000, 0);
|
|
13
|
+
|
|
14
|
+
// control bars
|
|
15
|
+
b1.increment();
|
|
16
|
+
b2.update(20, {filename: "test1.txt"});
|
|
17
|
+
b1.update(20, {filename: "helloworld.txt"});
|
|
18
|
+
|
|
19
|
+
b2.setTotal(2000);
|
|
20
|
+
let v = 200;
|
|
21
|
+
setInterval(()=>{
|
|
22
|
+
v=v+20
|
|
23
|
+
b2.update(v, {filename: "2222.txt"});
|
|
24
|
+
|
|
25
|
+
// stop all bars
|
|
26
|
+
|
|
27
|
+
//multibar.stop();
|
|
28
|
+
}, 300)
|
package/package.json
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "multi-tasks",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"directories": {
|
|
7
|
-
"example": "example"
|
|
8
|
-
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"test": "jest"
|
|
11
|
-
},
|
|
12
|
-
"keywords": [
|
|
13
|
-
"multitask",
|
|
14
|
-
"worker",
|
|
15
|
-
"multithread"
|
|
16
|
-
],
|
|
17
|
-
"author": "zhanglei923@gmail.com",
|
|
18
|
-
"license": "MIT",
|
|
19
|
-
"devDependencies": {
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "multi-tasks",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"directories": {
|
|
7
|
+
"example": "example"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"multitask",
|
|
14
|
+
"worker",
|
|
15
|
+
"multithread"
|
|
16
|
+
],
|
|
17
|
+
"author": "zhanglei923@gmail.com",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"cli-progress": "^3.12.0",
|
|
21
|
+
"jest": "^29.7.0"
|
|
22
|
+
}
|
|
23
|
+
}
|
package/test/splitter.test.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
let splitter = require('../workers/taskSplitter');
|
|
2
|
-
|
|
3
|
-
let createArray = (len)=>{
|
|
4
|
-
let alltasks = []
|
|
5
|
-
for(let i=0;i<len;i++){
|
|
6
|
-
alltasks.push(i)
|
|
7
|
-
}
|
|
8
|
-
return alltasks;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
test('test taskSplitter', async () => {
|
|
12
|
-
|
|
13
|
-
expect(splitter.split(createArray(3), 5).length).toBe(1);
|
|
14
|
-
expect(splitter.split(createArray(16), 5).length).toBe(4);
|
|
15
|
-
expect(splitter.split(createArray(101), 1).length).toBe(101);
|
|
16
|
-
expect(splitter.split(createArray(101), 33).length).toBe(4);
|
|
1
|
+
let splitter = require('../workers/taskSplitter');
|
|
2
|
+
|
|
3
|
+
let createArray = (len)=>{
|
|
4
|
+
let alltasks = []
|
|
5
|
+
for(let i=0;i<len;i++){
|
|
6
|
+
alltasks.push(i)
|
|
7
|
+
}
|
|
8
|
+
return alltasks;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
test('test taskSplitter', async () => {
|
|
12
|
+
|
|
13
|
+
expect(splitter.split(createArray(3), 5).length).toBe(1);
|
|
14
|
+
expect(splitter.split(createArray(16), 5).length).toBe(4);
|
|
15
|
+
expect(splitter.split(createArray(101), 1).length).toBe(101);
|
|
16
|
+
expect(splitter.split(createArray(101), 33).length).toBe(4);
|
|
17
17
|
});
|
package/todo.txt
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class AsyncQueue {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.queue = [];
|
|
4
|
+
this.isProcessing = false;
|
|
5
|
+
}
|
|
6
|
+
enqueue(task) {
|
|
7
|
+
this.queue.push(task);
|
|
8
|
+
|
|
9
|
+
if (!this.isProcessing) {
|
|
10
|
+
this.processNext();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async processNext() {
|
|
14
|
+
this.isProcessing = true;
|
|
15
|
+
if (this.queue.length === 0) {
|
|
16
|
+
this.isProcessing = false;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const task = this.queue.shift();
|
|
20
|
+
let result = task();
|
|
21
|
+
if(!result instanceof Promise) result = Promise.resolve(result);
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
await result;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.error('Error processing task:', error);
|
|
27
|
+
}
|
|
28
|
+
this.processNext(); // 处理完一个任务后,继续处理下一个任务
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = AsyncQueue;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function v1tov2(config) {
|
|
2
|
+
if(config.multi_task_parent_folder) config.taskRootFolder = config.multi_task_parent_folder;//backward compatible
|
|
3
|
+
delete config.multi_task_parent_folder;
|
|
4
|
+
|
|
5
|
+
if(config.numberOfWorks && !config.numberOfWorkers) config.numberOfWorkers = config.numberOfWorks; //Backward compatible with the wrong variable name "numberOfWorks"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
return config;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {v1tov2};
|
package/utils/makedir.js
CHANGED
|
@@ -1,24 +1,55 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
function sync(directoryPath) {
|
|
5
|
-
directoryPath = directoryPath.replace(/\\/g, '/');
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
function sync(directoryPath) {
|
|
5
|
+
directoryPath = directoryPath.replace(/\\/g, '/');
|
|
6
|
+
|
|
7
|
+
let isAbsPath = false;
|
|
8
|
+
if(directoryPath.startsWith('/')){
|
|
9
|
+
isAbsPath = true;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const directories = directoryPath.split('/');
|
|
13
|
+
|
|
14
|
+
let currentPath = isAbsPath ? '/':'';
|
|
15
|
+
for (let directory of directories) {
|
|
16
|
+
currentPath = path.join(currentPath, directory);
|
|
17
|
+
if (!fs.existsSync(currentPath)) {
|
|
18
|
+
try {
|
|
19
|
+
fs.mkdirSync(currentPath);
|
|
20
|
+
} catch (err) {
|
|
21
|
+
if (err.code !== 'EEXIST') {
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function getDirectFiles(dir, callback) {
|
|
29
|
+
let childrenfiles = [];
|
|
30
|
+
if(!fs.existsSync(dir)){
|
|
31
|
+
console.log('FATAL: directory is missing:', dir);
|
|
32
|
+
return process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
fs.readdir(dir, (err, files) => {
|
|
35
|
+
if (err) {
|
|
36
|
+
console.error("Could not list the directory.", err);
|
|
37
|
+
return callback([]);
|
|
38
|
+
}
|
|
39
|
+
files.forEach(file => {
|
|
40
|
+
const filePath = path.join(dir, file);
|
|
41
|
+
//console.log(filePath)
|
|
42
|
+
try{
|
|
43
|
+
let stats = fs.statSync(filePath);
|
|
44
|
+
if (stats.isFile()) {
|
|
45
|
+
childrenfiles.push(file);
|
|
46
|
+
}
|
|
47
|
+
}catch(e){
|
|
48
|
+
//
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
callback(childrenfiles);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = {sync, getDirectFiles};
|
package/utils/randoms.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
const fmtDigit = (n)=>{
|
|
3
|
+
return n > 9 ? "" + n: "0" + n;
|
|
4
|
+
}
|
|
5
|
+
const getDateTimeTxt = ()=>{
|
|
6
|
+
let d=new Date();
|
|
7
|
+
let YYYY=d.getFullYear()
|
|
8
|
+
let MM=fmtDigit(d.getMonth()+1);
|
|
9
|
+
let DD=fmtDigit(d.getDate());
|
|
10
|
+
let HH=fmtDigit(d.getHours());
|
|
11
|
+
let mm=fmtDigit(d.getMinutes());
|
|
12
|
+
let ss=fmtDigit(d.getSeconds());
|
|
13
|
+
return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;
|
|
14
|
+
};
|
|
15
|
+
module.exports = {getDateTimeTxt};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
const AsyncQueue = require(`../asyncQueue`);
|
|
2
|
+
const queue = new AsyncQueue();
|
|
3
|
+
|
|
4
|
+
let count=0;
|
|
5
|
+
|
|
6
|
+
queue.enqueue(async () => {
|
|
7
|
+
count++;
|
|
8
|
+
console.log(`Task ${count} start`);
|
|
9
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
10
|
+
console.log(`Task ${count} end`);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
queue.enqueue(async () => {
|
|
15
|
+
count++;
|
|
16
|
+
console.log(`Task ${count} start`);
|
|
17
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
18
|
+
console.log(`Task ${count} end`);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
queue.enqueue(() => {
|
|
23
|
+
count++;
|
|
24
|
+
console.log(`Task ${count} start`);
|
|
25
|
+
console.log(`Task ${count} end`);
|
|
26
|
+
return 11;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
queue.enqueue(() => {
|
|
31
|
+
count++;
|
|
32
|
+
console.log(`Task ${count} start`);
|
|
33
|
+
console.log(`Task ${count} end`);
|
|
34
|
+
return 11;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
queue.enqueue(() => {
|
|
38
|
+
count++;
|
|
39
|
+
console.log(`Task ${count} start`);
|
|
40
|
+
console.log(`Task ${count} end`);
|
|
41
|
+
return 11;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
queue.enqueue(() => {
|
|
45
|
+
count++;
|
|
46
|
+
console.log(`Task ${count} start`);
|
|
47
|
+
console.log(`Task ${count} end`);
|
|
48
|
+
return 11;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
queue.enqueue(() => {
|
|
52
|
+
count++;
|
|
53
|
+
console.log(`Task ${count} start`);
|
|
54
|
+
console.log(`Task ${count} end`);
|
|
55
|
+
return 11;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
queue.enqueue(() => {
|
|
59
|
+
count++;
|
|
60
|
+
console.log(`Task ${count} start`);
|
|
61
|
+
console.log(`Task ${count} end`);
|
|
62
|
+
return 11;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
queue.enqueue(async () => {
|
|
66
|
+
count++;
|
|
67
|
+
console.log(`Task ${count} start`);
|
|
68
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
69
|
+
console.log(`Task ${count} end`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
queue.enqueue(async () => {
|
|
75
|
+
count++;
|
|
76
|
+
console.log(`Task ${count} start`);
|
|
77
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
78
|
+
console.log(`Task ${count} end`);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
queue.enqueue(async () => {
|
|
84
|
+
count++;
|
|
85
|
+
console.log(`Task ${count} start`);
|
|
86
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
87
|
+
console.log(`Task ${count} end`);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
queue.enqueue(async () => {
|
|
93
|
+
count++;
|
|
94
|
+
console.log(`Task ${count} start`);
|
|
95
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
96
|
+
console.log(`Task ${count} end`);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
queue.enqueue(() => {
|
|
101
|
+
count++;
|
|
102
|
+
console.log(`Task ${count} start`);
|
|
103
|
+
console.log(`Task ${count} end`);
|
|
104
|
+
return 11;
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
queue.enqueue(async () => {
|
|
109
|
+
count++;
|
|
110
|
+
console.log(`Task ${count} start`);
|
|
111
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
112
|
+
console.log(`Task ${count} end`);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
package/utils/test_makedir.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
let makedir = require('./makedir');
|
|
2
|
-
makedir.sync('c:/aaa/bb')
|
|
1
|
+
let makedir = require('./makedir');
|
|
2
|
+
makedir.sync('c:/aaa/bb')
|
|
3
3
|
makedir.sync('c:/cc/dd')
|