use File::Find; use File::Copy; use File::Path; use threads; use Thread::Queue; my $FilenameQueue = Thread::Queue->new; my $FilenamewithpathQueue = Thread::Queue->new; my $DirectorynameQueue = Thread::Queue->new; my $ThreadnumberQueue = Thread::Queue->new; my $threadnumber = 0; my $thread; my $maxnumberofworkers = 3; if ($#ARGV != 0) {die "Usage: Perl runall.pl [storagedirectoryname]\n";} my $storagedirectory = $ARGV[0]; my $workbasedirectory = $storagebasedirectory . "/" . $storagedirectory; mkdir($workbasedirectory); print "Starting recursive directory search!\n"; find(\&docalc, $basedirectory); sub docalc { /\.txt$/ or return; while ($threadnumber >= $maxnumberofworkers){ sleep(1);} $FilenameQueue->enqueue($_); $FilenamewithpathQueue->enqueue($File::Find::name); $DirectorynameQueue->enqueue($File::Find::dir); $thread = threads->new(\&worker); $threadnumber++; $thread->detach; print "New thread created!\n";} sub worker { my @filename = split(/\./,$FilenameQueue->dequeue); print "Processing $filename[0]!\n"; my $workdirectory = $workbasedirectory . substr($DirectorynameQueue->dequeue,length($basedirectory)) . "/" . $filename[0]; $workdirectory=~ s/\n//gi; print "Creating directory" . $workdirectory . "\n"; mkpath($workdirectory); copyfiles($workdirectory, $FilenamewithpathQueue->dequeue, $filename[0]); print "Processing Calculations...\n"; open(RUNSCRIPT,">runscript.bash"); print RUNSCRIPT "cd $workdirectory\nperl scriptthatincludesfortran.pl >& $workbasedirectory/$filename[0].log"; close(RUNSCRIPT); if (system("bash runscript.bash") != 0) { die "failed!\n";} else { print "done!\n";} print "bash $workdirectory/runscript.bash\n"; print "\n"; $threadnumber--;}