您的位置:首页 > 编程语言

Perl 多进程与多线程编程

2015-11-09 22:51 253 查看
    PERL 多进程与多线程编程能大大加快程序执行效率(将一个任务分割成若干小任务并行处理)。要进行多进程和多线程编程则分别需要两个模块, fork()和Threads,然而fork()则为PERL内置函数,因此,只需安装Threads模块(如需变量共享,还需安装Thread::Shared模块)。安装方法如下:

    1)Win+R, 打开运行:

              


    2)在运行中输入:cmd 进入DOS环境

  


    3)在DOS下,输入“perl -e "use Threads"”,如果没有报错,则不需安装Threads模块(可跳过4-5)。

    4)安装Threads,在DOS下,输入"cpan", 按下Enter键, 直到出现”CPAN>“,如下图:


    
    5)在CPAN提示符后输入”install Threads“. 直到再次出现CPAN提示符,然后输入”exit“ 退出cpan,进入DOS中。最后按第3步再次测试Threads是否安装成功!

一、perl 多进程编程

#!/usr/bin/perl

use strict;

use warnings;

my $Max_pro =10;

   for (my $i = 1; $i < $Max_pro; ++$i){

        my $child_pro = fork();                                #创建进程

        if (!defined($child_pro)){                            

            die "launching child $child_pro\n";

                       }

        if ($child_pro == 0 ){

            do_child($i,$$);

            exit 0;

            }

                                       }

exit 0;

sub do_child{

    my ($i,$id) = @_;

    print "CHILD process $i ===>>> $id\n";

}

二、perl 多线程

模块中的方法:threads->create(), 创建一个新线程;

              threads->join(),收割已经创建的线程;

              threads->detach(),剥离创建的线程;

              threads->list(),返回所有已经创建的线程;

              threads->is_joinable(),返回目标线程是否已经完成,等待join;

              $thr->equql($thr2),   判断两个线程是否是相同的

              $thr->tid(),          获取$thr线程的ID号。

Example 1.

use Thread;
my @threads=(1,2,3,4);

foreach my $i (@threads) {

         next unless defined $mho;

         print "start one thread";
         $threads[$tempcount]=Thread->create(\&start_thread,$mho);
         $tempcount++;
                                     }
foreach my $thread (@threads) {

 $thread->join();

                                              }

sub start_thread{

 my ($infomho)=@_;

 print "in thread $infomho";
 sleep 20;
                           }

Example 2.

     

Example 3.

use threads;  #声明模块;
use warnings;use strict;
print localtme(time),"\n";   #输出系统时间;
my $j=0;
my $thread;
while(){ 
     last if ($j>=10); #这里控制一下任务数量,共10个;#控制创建的线程数,这里是5,scalar函数返回列表threads->list()元素的个数;
     while(scalar(threads->list())<5){ 
           $j++;   
          threads->new(\&ss,$j,$j);#创建一个线程,这个线程其实就是调用(引用)函数“ss”;函数‘ss’包含两个参数($j和$j);
                                      }
     foreach $thread(threads->list(threads::all)){
          if($thread->is_joinable()){ #判断线程是否运行完成;
             $thread->join();
             print scalar(threads->list()),"\t$j\t",localtime(time),"\n";#输出中间结果;
                                    }
                                                 }
       }
sub ss{ 
    my ($t,$s)=@_;
       sleep($t); #sleep函数,睡觉;以秒为单位;
       print "$s\t";
}
Example 4.

#!/usr/local/bin/perl   

use threads;   

@domain   =   ("tom.com",   "chinadns.com",   "163.com",   "aol.com");   
for ($i=0;$i<4;$i++){

    print   $i.'.'.$domain[$i].'     ';   

                              }   

print   "\n";   

my   $thr0   =   threads->new(\&checkwhois,   '0',   $domain[0]);   

my   $thr1   =   threads->new(\&checkwhois,   '1',   $domain[1]);   

my   $thr2   =   threads->new(\&checkwhois,   '2',   $domain[2]);   

my   $thr3   =   threads->new(\&checkwhois,   '3',   $domain[3]);   

    

sub   checkwhois()   

{   

    my ($l,$r)=@_;   

    my $i=0;   

    while($i<1000000)   

    {   

          $i*$i;   

          $i++;   

    }   

    print   "done  --$l\t\n";   

    print   $l.$r."   query   successful!   \n";    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息