$slot = 1; my $pm = new Parallel::ForkManager( 2 ); foreach $key ( sort { lc $a cmp lc $b || $a cmp $b } keys %array ) { if( $slot == 2 ){ $slot = 1; } elsif( $slot == 1 ){ $slot = 2; } $pm->start and next; if( ! -e "/mnt/storage/videotemp/$key.hevc" ) { $cmd = 'WINEPREFIX=~/.wine64_'.$slot.' wine ... ; print "\n$cmd\n\n"; exec($cmd); } $pm->finish; } $pm->wait_all_children; #### @data = ( 10,4,20,2,15,6 ); %slot = ( 'one' => 'unoccupied', 'two' => 'unoccupied' ); my $pm = new Parallel::ForkManager( 2 ); DATA_LOOP: foreach my $n (@data) { if ( $slot{ 'one' } eq 'unoccupied' ) { $slotnow = 'one'; $slot{ 'one' } = 'occupied'; } elsif ( $slot{ 'two' } eq 'unoccupied' ) { $slotnow = 'two'; $slot{ 'two' } = 'occupied'; } $pm->start and next DATA_LOOP; print $slotnow." sleep($n)\n"; system( "sleep $n" ); #print "- $slot{$slotnow} - $n\n"; $slot{ $slotnow } = 'unoccupied'; #print Dumper( %slot ); $pm->finish; } $pm->wait_all_children;