Perl 多进程与多线程编程
2015-11-09 22:51
253 查看
PERL 多进程与多线程编程能大大加快程序执行效率(将一个任务分割成若干小任务并行处理)。要进行多进程和多线程编程则分别需要两个模块, fork()和Threads,然而fork()则为PERL内置函数,因此,只需安装Threads模块(如需变量共享,还需安装Thread::Shared模块)。安装方法如下:
1)Win+R, 打开运行:
![](https://img-blog.csdn.net/20151109221809384?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2)在运行中输入:cmd 进入DOS环境
![](https://img-blog.csdn.net/20151109222301574?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3)在DOS下,输入“perl -e "use Threads"”,如果没有报错,则不需安装Threads模块(可跳过4-5)。
4)安装Threads,在DOS下,输入"cpan", 按下Enter键, 直到出现”CPAN>“,如下图:
![](https://img-blog.csdn.net/20151109222835836?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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";
}
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";
}
相关文章推荐
- Perl模块编写说明
- perl如何避免脚本在windows中闪一下就关闭
- Perl中的特殊内置变量详细介绍
- linux下使用perl获取本机ip的几种方法介绍
- perl 控制结构 条件控制 if while
- Perl中的列表和数组学习笔记
- perl数据库添加、删除、更新、查询操作例子
- perl操作MongoDB报错undefined symbol: HeUTF8解决方法
- Perl中使用MIME::Lite发送邮件实例
- 什么是Perl?编程语言Perl详细介绍
- About Perl(翻译Perl官网介绍)
- perl 基本语法介绍
- perl 模式匹配参数详解
- PERL脚本 学习笔记
- perl 列表和数组变量详解
- 探索Perl的世界(更新到40集)-Perl视频教程
- perl 文件读写详细说明
- perl中5个常见错误
- Perl ASCII 字符判断
- perl 学习资料整理篇第1/4页