У меня есть одно упражнение по управлению заданием asyn c в текущем и серийном вариантах. Но я не знаю решений или своих решений go правильно или неправильно? Любой может предложить или помочь мне в этом случае.
Требование 1. Журнал консоли должен отображаться, как показано ниже, если есть 3 одновременных задачи:
taskQueueProcessor () START, обработка 3 задач одновременно Задание 1 начато, выполнено за 2 с. Задание 2 начато, выполнено за 4 с. Задание 3 начато, выполнено за 6 секунд Задача 1 ВЫПОЛНЕНА! Задание 4 начато, выполнено за 8 секунд Задача 2 ВЫПОЛНЕНА! Задание 5 начато, выполнено за 10 секунд Задача 3 ВЫПОЛНЕНА! Задание 6 начато, выполнено за 12 с. Задача 4 ВЫПОЛНЕНА! Задание 7 начато, выполнено за 14 с. Задание 5 ВЫПОЛНЕНО! Задание 8 начато, выполнено за 16 секунд Задание 6 ВЫПОЛНЕНО! Задание 9 начато, выполнено за 18 секунд Задание 7 ВЫПОЛНЕНО! Задание 10 начато, выполнено за 20 секунд Задание 8 ВЫПОЛНЕНО! Задание 9 ВЫПОЛНЕНО! Задание 10 ВЫПОЛНЕНО! СОВЕРШЕНО через 44469 мс
Требование 2: Общее время обработки не должно превышать 50 с для 3 одновременных задач
'use strict';
var async = require('async');
/**
* Used for executing tasks concurrently
*
* enqueue function
* - Return a promise which will be executed
*
* @param {integer} numConcurrentTasks Number of concurrent tasks
* @param {function} getTask Function will be called to enqueue task, will return any available task
*
* @return {object}
*/
const run = async (numConcurrentTasks, getTask) => {
let listConcurrentTasks = [];
let listExistTask = [];
for (let index = 1; index <= 10; index++) {
if (index <= numConcurrentTasks) {
listConcurrentTasks.push(getTask());
} else {
listExistTask.push(getTask());
}
}
if (numConcurrentTasks > 1) {
let count = 1;
async.parallel(listConcurrentTasks, function (item, nextItem) {
async.series(listExistTask);
});
} else {
await run(1, getTask)
}
};
/**
* This function is used to stimulate task processing time
*/
const waitFor = ms => {
return new Promise(resolve => {
setTimeout(() => resolve(), ms);
});
};
/**
* Main
*/
const main = async () => {
const startedAt = Date.now();
// Define 10 tasks, task i_th would take i*2 seconds to finish
const tasks = [];
for (let i = 1; i <= 10; i++) {
const task = async () => {
console.log(`Task ${i} started, done in ${i * 2}s`);
await waitFor(i * 2000);
console.log(`Task ${i} DONE!`);
};
tasks.push(task);
}
console.log('Processing 3 tasks concurrently');
// Run 3 tasks concurrently
await run(3, () => {
// Shift one task from the list, this task should be queued up for processing
const task = tasks.shift();
if (!task) return;
// return the task for queueing
return task;
});
console.log(`DONE after ${Date.now() - startedAt}ms`)
};
main().catch(e => console.log(e.stack));
// Requirement 1: The console log should show as below if there are 3 concurrent tasks:
// taskQueueProcessor() START, processing 3 tasks concurrently
// Task 1 started, done in 2s
// Task 2 started, done in 4s
// Task 3 started, done in 6s
// Task 1 DONE!
// Task 4 started, done in 8s
// Task 2 DONE!
// Task 5 started, done in 10s
// Task 3 DONE!
// Task 6 started, done in 12s
// Task 4 DONE!
// Task 7 started, done in 14s
// Task 5 DONE!
// Task 8 started, done in 16s
// Task 6 DONE!
// Task 9 started, done in 18s
// Task 7 DONE!
// Task 10 started, done in 20s
// Task 8 DONE!
// Task 9 DONE!
// Task 10 DONE!
// DONE after 44469ms
// Requirement 2: The whole processing time should be no longer than 50s, for a 3 concurrent tasks
Это мой результат:
Processing 3 tasks concurrently
Task 1 started, done in 2s
Task 2 started, done in 4s
Task 3 started, done in 6s
DONE after 4ms
Task 1 DONE!
Task 2 DONE!
Task 3 DONE!
Task 4 started, done in 8s
Task 4 DONE!
Task 5 started, done in 10s
Task 5 DONE!
Task 6 started, done in 12s
Task 6 DONE!
Task 7 started, done in 14s
Task 7 DONE!
Task 8 started, done in 16s
Task 8 DONE!
Task 9 started, done in 18s
Task 9 DONE!
Task 10 started, done in 20s
Task 10 DONE!