aaron.schweitzer has asked for the wisdom of the Perl Monks concerning the following question:
Hello Monks,
I need some help with this problem.
I am working on a perl code to run File::Find. Code is to try and spawn multiple threads that does a find on different mountpoints/dirs (finds files owned by specific uid). I want to spawn multiple threads so that I could reduce the time taken to search the whole system.
However the problem is when i spawn only one thread (ie, $thr1), it is able to find all files from that dir. However, when i enabled both threads, thread 1 is skipped in middle.
example When only thr1 was enabled thr2 was commented out:<br> tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 3948 When only thr2 was enabled thr1 was commented out: tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 1436 When both were enabled (below code): tstsrv:/home/aaron # ./collect_files_threaded.pl -u aaron | wc -l 1753 Each thread updates a global variable. I got the code generated by find2perl command to create the function f +indFiles.
use File::Find; use threads; use threads::shared; my $user :shared = $cargs{u}; my $uidNum :shared = getpwnam($user); my $user_file :shared = "/var/tmp/test_$user.file.list"; my @array_to_write :shared; my $thr1 = threads->create(\&find, \&findFiles, "/var/tmp"); my $thr2 = threads->create(\&find, \&findFiles, "/tmp"); $thr1->join(); $thr2->join(); print "Saving the details to $user_file\n"; saveFile($user_file,@array_to_write); exit; sub findFiles { my ($dev,$ino,$mode,$nlink,$uid,$gid,$file,$fstype); $file=$File::Find::name; lock(@array_to_write); (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($file)) && !($File::Find::prune |= ($dev != $File::Find::topdev)) && ($uid == "$uidNum") && push (@array_to_write,"$file:$uidNum:$gid:$mode:$fstype"); } sub saveFile{ my($file,@data)=@_; open(F,">$file") or die("Error:Failed to open $file for write:$!\n +"); print F (join("\n",@data) . "\n"); close(F); }
======================================================================
Update: Moved the parallel execution of find into multiple processes instead of threads. Each process takes care of a mount point available in the system.
foreach my $mnt (@mounts) { $script="file_collections.pl -u $user -m $mnt"; my $pid = fork; if (not defined $pid) { die 'Could not fork child'; next; } if ($pid) { $forks++; Log ("Parent process PID ($$) starting Child pid: $pid for $mn +t. \nNum of forked child processes: $forks\n"); } else { Log ("child PID ($$) --> executing \'$script\' \n"); exec ("$scr_loc/$script"); exit; } } for (my $i = 0; $i < $forks; $i++){ my $pid = wait(); Log ("$0 : $pid Completed\n"); } file_collections.pl Log ("Start Time \t\t: $datestring \n\n"); Log ("Finding the files for $user with uid $uidNum on $mount\n"); $path=$mount; $path=~s/\//_/g; $user_file = "$log_dir/$user$path.list"; $user_log_file = "$log_dir/$user$path.log"; find(\&findFiles, "$mount"); $datestring = getDateTime(); Log ("Total number of files parsed on $mount = $count\n"); Log ("Saving the details to $user_file\n\n"); Log ("End Time \t\t: $datestring\n"); saveFile($user_file,@array_to_write); saveFile($user_log_file,@log); sub findFiles { my ($dev,$ino,$mode,$nlink,$uid,$gid,$file,$fstype); $file=$File::Find::name; $fstype=findFstype("$file"); $count++; (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($file)) && !($File::Find::prune |= ($dev != $File::Find::topdev)) && ($uid == "$uidNum") && push (@array_to_write,"$file:$uidNum:$gid:$mode:$fstype"); }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Perl threads - parallel run not working
by BrowserUk (Patriarch) on Sep 15, 2015 at 19:41 UTC | |
by dave_the_m (Monsignor) on Sep 15, 2015 at 21:25 UTC | |
by BrowserUk (Patriarch) on Sep 15, 2015 at 23:26 UTC | |
by aaron.schweitzer (Novice) on Sep 16, 2015 at 05:52 UTC | |
Re: Perl threads - parallel run not working
by salva (Canon) on Sep 16, 2015 at 06:41 UTC | |
Re: Perl threads - parallel run not working
by marioroy (Prior) on Sep 16, 2015 at 08:50 UTC | |
by marioroy (Prior) on Sep 16, 2015 at 08:57 UTC | |
by Yary (Pilgrim) on Sep 16, 2015 at 15:21 UTC | |
Re: Perl threads - parallel run not working
by Anonymous Monk on Sep 15, 2015 at 23:33 UTC | |
A reply falls below the community's threshold of quality. You may see it by logging in. |