#! perl -slw use strict; use threads qw[ yield ]; use threads::shared; our $MAXTIME ||= 7200; our $CMDS ||= 140; our $CONCURRENT ||= 6; my $running :shared = 0; my @cmds = map { my $time = int rand $MAXTIME; qq[ perl -e"sleep $time" ]; } 1 .. $CMDS; for my $cmd ( @cmds ) { sleep 1 while do{ lock $running; $running >= $CONCURRENT }; async{ my $n = do{ lock $running; ++$running; }; my $tid = threads->tid; print "$tid: starting '$cmd' ($n)"; system $cmd; print "$tid: ending"; { lock $running; --$running; } }->detach; yield; } sleep 1 while do{ lock $running; $running }; #### __END__ C:\test>t-CmdN -MAXTIME=10 -CMDS=20 1: starting ' perl -e"sleep 4" ' (1) 2: starting ' perl -e"sleep 7" ' (2) 3: starting ' perl -e"sleep 0" ' (3) 4: starting ' perl -e"sleep 3" ' (4) 3: ending 5: starting ' perl -e"sleep 0" ' (4) 6: starting ' perl -e"sleep 1" ' (5) 5: ending 7: starting ' perl -e"sleep 9" ' (5) 8: starting ' perl -e"sleep 1" ' (6) 6: ending 8: ending 9: starting ' perl -e"sleep 1" ' (5) 10: starting ' perl -e"sleep 2" ' (6) 9: ending 4: ending 11: starting ' perl -e"sleep 2" ' (5) 10: ending 12: starting ' perl -e"sleep 2" ' (5) 13: starting ' perl -e"sleep 5" ' (6) 1: ending 14: starting ' perl -e"sleep 7" ' (6) 11: ending 12: ending 15: starting ' perl -e"sleep 7" ' (5) 16: starting ' perl -e"sleep 0" ' (6) 16: ending 17: starting ' perl -e"sleep 2" ' (6) 2: ending 18: starting ' perl -e"sleep 5" ' (6) 13: ending 17: ending 19: starting ' perl -e"sleep 7" ' (5) 20: starting ' perl -e"sleep 6" ' (6) 7: ending 14: ending 15: ending 18: ending 20: ending 19: ending