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)=@_;
 print "in thread $infomho";
 sleep 20;
                           }

Example 2.

#!/bin/perl
use threads;
use threads::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()){
    foreach my $t(threads->list(threads::joinable)){
        $t->join();
    }
  
    # all tasks done and no running child, then exit
    if ($child_num==4){
        exit;
    }
}
  
sub start_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)=@_;
       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"
   
}

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值