Perl 多进程与多线程编程

来源:转载


    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)[email protected]_;
 print "in thread $infomho"; sleep 20;                           }
Example 2.

#!/bin/perlusethreads;usethreads::shared; # 涉及到一些进程间变量的共享,用这个模块  my$process = 4;my$child_num = 0;  print$threads::VERSION.chr(10);  while(1) {    if($child_num< $process){        my$params = $child_num.':..........';        my$thr = threads->create(/&start_thread,$params);               $child_num++;    }      #foreach my $t(threads->list()){     foreachmy $t(threads->list(threads::joinable)){        $t->join();    }      # all tasks done and no running child, then exit    if($child_num==4){        exit;    }}  substart_thread(){    # do actually task here     my$param = shift;    print$param.chr(10);}     

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)[email protected]_;       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)[email protected]_;   
    my $i=0;   
    while($i<1000000)   
      
          $i*$i;   
          $i++;   
      
    print   "done  --$l/t/n";   
    print   $l.$r."   query   successful!   /n";    
}



分享给朋友:
您可能感兴趣的文章:
随机阅读: