Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Threads and print

by gone2015 (Deacon)
on Apr 16, 2009 at 08:53 UTC ( [id://757901]=note: print w/replies, xml ) Need Help??


in reply to Threads and print

my @threads = map { ## create the workers passing the log file handle and semaphore threads->create( \&worker, $log, \$logSem,$_*$N, $_*$N + $N -1); } 0 .. 5; ## 5 threads each processing 100 "files"
...<hem>that's 6 threads, shirly ?

To process $from..$to in $t threads, how about:

my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ;
and in the thread:
my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { ...... } ;
which deals with the number of files not being an exact multiple of the number of threads, and copes with $from..$to range where $from is not zero and $to is included in the range...

Replies are listed 'Best First'.
Re^2: Threads and print
by sandy1028 (Sexton) on Apr 16, 2009 at 09:52 UTC
    Can you please tell me how to create single log file per thread and the values are in sequence order.
      'ang about gov'ner, I thought you wanted to have all the threads writing to the same log file? No? OK, then open a new log file in the worker function. Use some unique value passed as a parameter as part of the file name.
        Hi, Here I used the code for writing into single log file.
        But the threads are not printing the "Processesing file" in sequence order and the lines overlap even if I use lock. How can i avoid this?
        #! perl -slw use strict; use threads; use threads::shared; our $from=1; our $to=400020; our $t=5; sub worker { my $tid = threads->tid; # my( $log, $semRef, $from, $to ) = @_; my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { lock $$semRef; printf $log "The threads is [%2d] Processesing file%3d\n",$tid, $file +; } } ## A shared variable used as a semaphore for the log file resource my $logSem :shared; ## Open the log file in the main thread open my $log, '>', 'myLog' or die $!; my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ; ## Wait till they are done $_->join for @threads; ## close the log close $log;
        The threads is [ 1] Processesing file16436 The threads is [ 1] Processesing file16441 The threads is [ 1] Processesing file 2] Processesing file2462 The threads is [ 2] Processesing file2467 The threads is [ 2] Processesing file2472
        In place of print $log ("The threads is $tid Processing file, $file"); How to print the file names of the directory.
        #! perl -slw use strict; use threads; use threads::shared; our $N ||= 100; our $t=5; our $from=1; our $filenames; sub worker { my $tid = threads->tid; # my( $log, $semRef, $from, $to ) = @_; my( $log, $semRef, $from, $step, $to ) = @_; for (my $file = $from ; $file <= $to ; $file += $step) { lock $$semRef; print $log ("The threads is $tid Processing file, $file"); } } ## A shared variable used as a semaphore for the log file resource my $logSem :shared; ## Open the log file in the main thread open my $log, ">myLog" or die $!; my @threads = map{ threads->create( \&worker, $log, \$logSem, $from + ($_ - 1), $t, $to +) ; } 1 .. $t ; ## Wait till they are done $_->join for @threads; ## close the log close $log;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://757901]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (4)
As of 2024-04-19 16:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found