Perl多线程和多进程实例

发布时间:2020-04-02编辑:脚本学堂
Perl多线程和多进程实例,纯英文的,英语强的朋友参考下吧。技术文章,当然还是外文的强啊,你懂的。

Perl多线程和多进程实例,纯英文的,英语强的朋友参考下吧。技术文章,当然还是外文的强啊,你懂的。

Added by Andree Toonk, last edited by Andree Toonk on May 27, 2009  (view change)
Comment: Below you'll find an example of a multi-threaded Perl program as well as a forked Perl program.Both seem to work fine. A disadvantage of threads is that Perl needs to be compiled with threads support.Not all versions of Perl come with that by default.

A Perl Thread example
 

复制代码 代码如下:

#!/usr/local/roadm/bin/perl

# This is compiled with threading support

use strict;
use warnings;
use threads;
use threads::shared;

print "Starting main programn";

my @threads;
for ( my $count = 1; $count <= 10; $count++) {
        my $t = threads->new(&sub1, $count);
        push(@threads,$t);
}
foreach (@threads) {
        my $num = $_->join;
        print "done with $numn";
}
print "End of main programn";

sub sub1 {
        my $num = shift;
        print "started thread $numn";
        sleep $num;
        print "done with thread $numn";
        return $num;
}

Will print:

Starting main program

started thread 1
started thread 2
started thread 3
started thread 4
started thread 5
started thread 6
started thread 7
started thread 8
started thread 9
started thread 10
done with thread 1
done with 1
done with thread 2
done with 2
done with thread 3
done with 3
done with thread 4
done with 4
done with thread 5
done with 5
done with thread 6
done with 6
done with thread 7
done with 7
done with thread 8
done with 8
done with thread 9
done with 9
done with thread 10
done with 10
End of main program

Perl Fork example

This examples fork 10 child processes.
It will wait for all childs to finish before exiting.
 

复制代码 代码如下:

#!/usr/local/roadm/bin/perl
use strict;
use warnings;

print "Starting main programn";
my @childs;

for ( my $count = 1; $count <= 10; $count++) {
        my $pid = fork();
        if ($pid) {
        # parent
        #print "pid is $pid, parent $$n";
        push(@childs, $pid);
        } elsif ($pid == 0) {
                # child
                sub1($count);
                exit 0;
        } else {
                die "couldnt fork: $!n";
        }
}

foreach (@childs) {
        my $tmp = waitpid($_, 0);
         print "done with pid $tmpn";
}     

print "End of main programn";

sub sub1 {
        my $num = shift;
        print "started child process for  $numn";
        sleep $num;
        print "done with child process for $numn";
        return $num;
}

Output looks like:

Starting main program

started child process for  1
started child process for  2
started child process for  3
started child process for  4
started child process for  5
started child process for  6
started child process for  9
started child process for  10
started child process for  7
started child process for  8
done with child process for 1
done with pid 5584
done with child process for 2
done with pid 5585
done with child process for 3
done with pid 5586
done with child process for 4
done with pid 5587
done with child process for 5
done with pid 5588
done with child process for 6
done with pid 5589
done with child process for 7
done with pid 5590
done with child process for 8
done with pid 5591
done with child process for 9
done with pid 5593
done with child process for 10
done with pid 5594
End of main program

本文来源:http://wiki.bc.net/atl-conf/pages/viewpage.action?pageId=20548191