sub Create { my ( $sourcePath, $destinationPath ) = @_; # ... create directories and stuff ... my $tq = Thread::Queue->new(); for (1..5) { push @arrThreads, threads->create( sub { while (defined(my $item = $q->dequeue())) { DoSomethingWithItem($item, $sourcePath, $destinati +onPath); } } ); } while (my ($k, $v) = each(%hashFileList)) { $tq->enqueue( $v ); } $tq->end(); foreach (@arrThreads) { my $num = $_->join; } }
The major change here is that it's passing the files one item at a time to the threads. You're dividing them to n buckets and passing the whole bucket to the thread at creation time.
Apart from being nicer to look at, this one-at-a-time (supervisor-worker) approach should ensure that the threads will finish quicker since they're given equal amounts of work.
In reply to Re^3: How to make a thread to wait till a command on shell get completed.
by Anonymous Monk
in thread How to make a thread to wait till a command on shell get completed.
by techman2006
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |