Wednesday, April 13, 2011

Perl - Using threads

Thread using in Perl:
use strict;
use warnings;
# Use thread module 
use threads ('yield','stack_size' => 64*4096,'exit' => 'threads_only','stringify');

&RunThreads();

#################################################################################
# SubRoutines

sub RunThreads()
{
    # Running thread List
    my @findFilesThreads;

    # Create Threads
    my $dirName = "Directory1";
    my @filesList = ("file11","file12","file13");
    # Launch thread with its argument
    my $thr = threads->create('ThreadFunc',($dirName,@filesList ));
    push(@findFilesThreads,$thr);

    $dirName = "Directory2";
    @filesList = ("file21","file22","file23");
    # Launch thread with its argument
    $thr = threads->create('ThreadFunc',($dirName,@filesList ));
    push(@findFilesThreads,$thr);

    $dirName = "Directory3";
    @filesList = ("file31","file32","file33");
    # Launch thread with its argument
    $thr = threads->create('ThreadFunc',($dirName,@filesList ));
    push(@findFilesThreads,$thr);

    # Wait threads to finish
    foreach (@findFilesThreads)
    {
        my $thread = $_;
        if (defined($thread))
        {
            if ($thread->is_running())
            {
                $thread->join();
            }
            else
            {
                $thread->detach()
            }
        }
    }
}


# The Thread subroutin
sub ThreadFunc
{
    my ($dirName,@filesName) = @_;

    # Random sleep, So every time the Thread print order will be different
    sleep rand(5);
    print "Directory name is : $dirName\n";
    print "Files are : \n";
    foreach (@filesName)
    {
        print "     $_\n";
    }
}



The output of this script should look like (Every time the thread order will be different) :
Directory name is : Directory2
Files are :
    file21
    file22
    file23
Directory name is : Directory3
Files are :
    file31
    file32
    file33
Directory name is : Directory1
Files are :
    file11
    file12
    file13

No comments: