Как объединить asyn c .parrallel и asyn c .series, чтобы получить результат? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть одно упражнение по управлению заданием 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...