@@ -90,24 +90,30 @@ export default function createParallelWorker(generatorName, pool, options) {
9090 { generator : generatorName , chunks : chunks . length , chunkSize, threads }
9191 ) ;
9292
93- // Submit all tasks to Piscina and wrap with index tracking
94- const pending = chunks . map ( ( indices , i ) =>
95- pool
96- . run ( createTask ( generator , fullInput , indices , opts , generatorName ) )
97- . then ( result => ( { i, result } ) )
93+ // Submit all tasks to Piscina - each promise resolves to itself for removal
94+ const pending = new Set (
95+ chunks . map ( indices => {
96+ const promise = pool
97+ . run ( createTask ( generator , fullInput , indices , opts , generatorName ) )
98+ . then ( result => ( { promise, result } ) ) ;
99+
100+ return promise ;
101+ } )
98102 ) ;
99103
100104 // Yield results as they complete (true parallel collection)
101- for ( let completed = 0 ; completed < chunks . length ; completed ++ ) {
102- const { i, result } = await Promise . race ( pending ) ;
105+ let completed = 0 ;
103106
104- // Replace completed promise with one that never resolves
105- pending [ i ] = new Promise ( ( ) => { } ) ;
107+ while ( pending . size > 0 ) {
108+ const { promise , result } = await Promise . race ( pending ) ;
106109
107- parallelLogger . debug (
108- `Chunk ${ completed + 1 } /${ chunks . length } completed` ,
109- { generator : generatorName }
110- ) ;
110+ pending . delete ( promise ) ;
111+
112+ completed ++ ;
113+
114+ parallelLogger . debug ( `Chunk ${ completed } /${ chunks . length } completed` , {
115+ generator : generatorName ,
116+ } ) ;
111117
112118 yield result ;
113119 }
0 commit comments