The selected answer proposes 2 ways both waiting termination of all "spawned" async functions.
My proposal is instead to spawn each asynch function using setImmediate
(nodejs ~equivalent to setTimeout(0)) to run each function and get intermediate results before teh completions of all functions:
for (let i = 0; i < numSpawns; i++ ) {
// nodejs
setImmediate( async () => { console.log( await runAsyncFunction(msecsMax) ) } )
// browser
// substitute setImmediate with setTimeout( await runAsyncFunction, 0, msecsmax )
}
Complete demo code
/**
* parallel.js
* demo, to "spawn" in parallel multiple async functions
*/
/**
* sleep
* warp setTimeout, returning a value
*
* @async
* @param {Number} msecs number of milliseconds
* @return {Number} msecs
*/
function sleep(msecs) {
return new Promise(function(resolve /*, reject*/) {
setTimeout( () => { resolve(msecs) }, msecs )
})
}
/**
* randomInteger
* Returns a random integer number between min (inclusive) and max (inclusive)
* @param {Number} min
* @return {Number} max
*/
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
/**
* runAsyncFunction
* simulate an async function,
* returning, after a random number of msecs, the number of msecs
*
* @async
* @param {Number} msecsMax max duration in milliseconds
* @return {Number} random number of msecs
*/
async function runAsyncFunction(msecsMax) {
const msecsMin = 500
return await sleep( randomInteger(msecsMin, msecsMax) )
}
async function parallel(numSpawns, msecsMax) {
for (let i = 0; i < numSpawns; i++ ) {
// nodejs
setImmediate( async () => { console.log( await runAsyncFunction(msecsMax) ) } )
// browser
// substitute setImmediate with setTimeout( await runAsyncFunction, 0, msecsmax )
}
}
async function main() {
const msecsMax = 3000
const numSpawns = 10
// runs in "parallel" 10 async functions,
// each one returning after a sleep of a random number of milliseconds (between 500 to 3000)
parallel(numSpawns, msecsMax)
}
main()
Run the program:
$ /usr/bin/time --verbose node parallel
1204
1869
1983
2042
2119
2220
2222
2611
2642
2660
Command being timed: "node parallel"
User time (seconds): 0.07
System time (seconds): 0.00
Percent of CPU this job got: 3%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.72
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 31568
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 2160
Voluntary context switches: 39
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0