Drain an awaited work queue one item at a time and label the throughput from a deterministic count.

queue drain An async queue report awaits each item in turn and keeps the drained count scalar, so the drain order never varies.

Async Queue Coordination Report

pending
async_queue_coordination.js
Replay: real traced execution (multi-file project)
const pending = 4;
let drained = 0;
let outcome = "empty";

async function coordinate(count) {
    const queue = Array.from({ length: count }, (_, i) => i + 1);
    while (queue.length > 0) {
        const item = queue.shift();
        await Promise.resolve(item);
        drained += 1;
    }
    if (drained >= 7) {
        outcome = "backlog";
    } else if (drained > 0) {
        outcome = "flowing";
    }
    console.log(`pending=${count} drained=${drained} status=${outcome}`);
}

coordinate(pending);
const pending = 0;
let drained = 0;
let outcome = "empty";

async function coordinate(count) {
    const queue = Array.from({ length: count }, (_, i) => i + 1);
    while (queue.length > 0) {
        const item = queue.shift();
        await Promise.resolve(item);
        drained += 1;
    }
    if (drained >= 7) {
        outcome = "backlog";
    } else if (drained > 0) {
        outcome = "flowing";
    }
    console.log(`pending=${count} drained=${drained} status=${outcome}`);
}

coordinate(pending);
const pending = 7;
let drained = 0;
let outcome = "empty";

async function coordinate(count) {
    const queue = Array.from({ length: count }, (_, i) => i + 1);
    while (queue.length > 0) {
        const item = queue.shift();
        await Promise.resolve(item);
        drained += 1;
    }
    if (drained >= 7) {
        outcome = "backlog";
    } else if (drained > 0) {
        outcome = "flowing";
    }
    console.log(`pending=${count} drained=${drained} status=${outcome}`);
}

coordinate(pending);
  1. pending ← 4, drained ← 0, outcome ← empty

    1const pending→ 4 = 4;  //@pending=0, 72let drained→ 0 = 0;3let outcome→ empty = "empty";45async function coordinate(count) {6    const queue = Array.from({ length: count }, (_, i) => i + 1);7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending4);
  2. queue ← 1,2,3,4

    2let drained = 0;3let outcome = "empty";45async function coordinate(count4) {6    const queue→ 1,2,3,4 = Array.from({ length: count4 }, (_, i) => i + 1);7    while (queue.length > 0) {
  3. queue ← 2,3,4, item ← 1

    pass 1 of 4
    5async function coordinate(count) {6    const queue = Array.from({ length: count }, (_, i) => i + 1);7    while (queue.length4 > 0) {8        const item→ 1 = queue→ 2,3,4.shift();9        await Promise.resolve(item1);10        drained += 1;
    All 4 passes — pass 1 is the card above
    passqueue.lengthqueueitemdrained
    141,2,3,4 2,3,41
    232,3,4 3,422
    323,4 433
    414 (empty)44
  4. drained ← 1

    7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item1);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending4);
    values this step1drained
  5. if (drained > 0)

    13    outcome = "backlog";14} else if (drained4 > 0) {15    outcome = "flowing";16}
  6. console.log(`pending=${count} drained=${drained} status=${outcome}`);

    15        outcome = "flowing";16    }17    console.log(`pending=${count4} drained=${drained4} status=${outcomeflowing}`);18}
    outputpending=4 drained=4 status=flowing
  1. pending ← 0, drained ← 0, outcome ← empty

    1const pending→ 0 = 0;2let drained→ 0 = 0;3let outcome→ empty = "empty";45async function coordinate(count) {6    const queue = Array.from({ length: count }, (_, i) => i + 1);7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending0);
  2. queue ← (empty)

    2let drained = 0;3let outcome = "empty";45async function coordinate(count0) {6    const queue→ (empty) = Array.from({ length: count0 }, (_, i) => i + 1);7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count0} drained=${drained0} status=${outcomeempty}`);18}
    outputpending=0 drained=0 status=empty
  3. coordinate(pending);

    17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending0);
  1. pending ← 7, drained ← 0, outcome ← empty

    1const pending→ 7 = 7;2let drained→ 0 = 0;3let outcome→ empty = "empty";45async function coordinate(count) {6    const queue = Array.from({ length: count }, (_, i) => i + 1);7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending7);
  2. queue ← 1,2,3,4,5,6,7

    2let drained = 0;3let outcome = "empty";45async function coordinate(count7) {6    const queue→ 1,2,3,4,5,6,7 = Array.from({ length: count7 }, (_, i) => i + 1);7    while (queue.length > 0) {
  3. queue ← 2,3,4,5,6,7, item ← 1

    pass 1 of 7
    5async function coordinate(count) {6    const queue = Array.from({ length: count }, (_, i) => i + 1);7    while (queue.length7 > 0) {8        const item→ 1 = queue→ 2,3,4,5,6,7.shift();9        await Promise.resolve(item1);10        drained += 1;
    All 7 passes — pass 1 is the card above
    passqueue.lengthqueueitemdrained
    171,2,3,4,5,6,7 2,3,4,5,6,71
    262,3,4,5,6,7 3,4,5,6,722
    353,4,5,6,7 4,5,6,733
    444,5,6,7 5,6,744
    535,6,7 6,755
    626,7 766
    717 (empty)77
  4. drained ← 1

    7    while (queue.length > 0) {8        const item = queue.shift();9        await Promise.resolve(item1);10        drained += 1;11    }12    if (drained >= 7) {13        outcome = "backlog";14    } else if (drained > 0) {15        outcome = "flowing";16    }17    console.log(`pending=${count} drained=${drained} status=${outcome}`);18}1920coordinate(pending7);
    values this step1drained
  5. if (drained >= 7)

    10    drained += 1;11}12if (drained7 >= 7) {13    outcome = "backlog";14} else if (drained > 0) {
  6. console.log(`pending=${count} drained=${drained} status=${outcome}`);

    15        outcome = "flowing";16    }17    console.log(`pending=${count7} drained=${drained7} status=${outcomebacklog}`);18}
    outputpending=7 drained=7 status=backlog