注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

网易考拉推荐

【转】 perl 多线程  

2012-05-17 10:53:24|  分类: perl&bioperl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.sina.com.cn/s/blog_4af3f0d20100fcr3.html

刚学perl多线程,下面是一些多线程的例子,希望看后会有些帮助

例子一:
http://yufengseu.spaces.live.com/Blog/cns!31875D62B958914B!138.entry
以前为了方便自己(当然也是为了偷懒^_^)使用perl写了一个脚本来抓取网页,并进行分析以获取我想要的信息,随着要抓取的网页越来越多,这个脚本的执行效率明显变慢,于是想到了使用多线程来节省在抓取网页上花费的时间(这个是耗时最多的过程占了90%的时间)
由于对perl的使用时间不是很长, 使用的次数也不是很多,因此一直不知道perl支持多线程,更不用说用了.
不过我遇到问题习惯在网上搜一番,发现大部分都是使用perl的多线程来写ftp下载,或是密码的破解(穷举法). 对perl的多线程的使用的讲解还不是很明白
 
其实使用perl的多线程很简单:
 
use Thread;
#use threads::shared;
 
my @threads;
 
open(MHO,$mhofile);
my @mholist=<MHO>;
 
foreach my $mho (@mholist) {
 next unless defined $mho;
         print "start one thread";
          $threads[$tempcount]=Thread->new(\&start_thread,$mho);
           $tempcount++;
                                            }
foreach my $thread (@threads) {
 $thread->join();
}
 
sub start_thread{
 my ($infomho)=@_;
 print "in thread $infomho";
 sleep 20;
                           }
以上就是一个多线程的例子,创建线程的方法有好几种 (比如create(...))启 动了多干个线程后,我们这里一定要使用变量保存thread的id。因为,创建一个thread以后要用join取得该thread的返回值,然后系统才 会对thread进行清理,否则所有thread的信息都会保留下来,当然越积越多了。对返回值不关心的时候要用detach显式剥离该thread。所 以,在最后我们要等待这些线程的完全退出:
foreach my $thread (@threads) {
 $thread->join();
}

否则,threads库会在最后打印如下信息:
thread exited while threads were running.
 
至于多线程的其他方法的使用还在学习中^_^.

例子二:
http://www.cnblogs.com/joechen/archive/2009/04/27/1444569.html


 

Perl语言的多线程(一)

Perl中的多线程的实现一般有两种办法,而老版本的办法实际上是一种多进程的办法。

一   Thread->New

该办法是传统的老办法,它与folk很类似,新建一个进程时,会把当前内存空间的所有变量都复制一份传到新的进程里面。已实现共享数据。而随着技术的发展,本文不针对该方法做深入研究。

二   IThread

这种方法是通过新建一个新的perl interpreter。默认情况下,所有的数据和变量是不被线程共享的。如果想共享一个变量,需通过threads::shared来实现。在使用此方法的时候,需要注意以下三点:

  1. 变量默认是不在线程中共享的。
  2. 通过"use threads"引用命名空间,不能通过 , do, 或者 require。
  3. 如果有变量需要共享,必须引用"threads::shared"。 并在定义变量的时候如下:

            my $var1 : shared = "value";

 以下是一个简单的使用perl 多线程的例子。

 

#!/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"
   
}

$thr0
->
join;  
$thr1
->
join;   
$thr2
->
join;   
$thr3
->
join;
这个简单的perl主要是新建了4个子线程去做不同的事情,然后调用join方法等待他们执行完成并让线程自动回收
但有时,还是需要结合folk 做一些复杂的工作,下面是关于这个的例外一个demo。看原文连接

例子三:
perl多线程编程给我的总体感觉有点像Linux C POSIX多线程编程。perl多线程编程使用起来非常方便,但要深入掌握还是要下点功夫的。这里有一个简单的例子:
 

#!/bin/perl
 
use strict;
use threads;
use Cwd;
use POSIX qw(strftime);
 
################################################################################
# 函数名:  count
# 函数描述:  数数
# 输入:   name 随意输入一个名字
# 输出:  
# 调用:  
# 被调用: 
# 返回:
################################################################################
sub count
{
   my ($name) = @_;
   my $current_time = strftime "%Y-%m-%d %H:%M:%S", localtime;
   for ($i = 0; $i <= 10000; $i++)
   {
     print "$current_time  $name $i";
   }
}
 
创建第一批线程
my $thread_1_01 = threads->create('count', Thread_1);
my $thread_1_02 = threads->create('count', Thread_2);
my $thread_1_03 = threads->create('count', Thread_3);
my $thread_1_04 = threads->create('count', Thread_4);
 
# 等待第一批线程结束完成
$thread_1_01->join();
$thread_1_02->join();
$thread_1_03->join();
$thread_1_04->join();

# 创建第二批线程
my $thread_2_01 = threads->create('count', Thread_5);
my $thread_2_02 = threads->create('count', Thread_6);
my $thread_2_03 = threads->create('count', Thread_7);
 
# 等待第二批线程结束完成
$thread_2_01->join();
$thread_2_02->join();
$thread_2_03->join();
  评论这张
 
阅读(1084)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016