perl 多线程

需要引入的pm文件有:

use threads; #导入threads多线程处理包

use threads::shared; #使用线程间共享变量

程序和C基本上一样,下面是有关线程操作的相关代码:

#main function
sub main()
{
$dbcon = ConnectTD();
while(1)
{
my @dataset = Get_Config_Info();
my $rec_cnt = @dataset;
for(my $i=0;$i {
processFiles($dataset[$i][0],$dataset[$i][1],$dataset[$i][2],$dataset[$i][5],$dataset[$i][6],$dataset[$i][7]);
}
foreach my $thread (@threads)
{
# join() does three things: it waits for a thread to exit,
# cleans up after it, and returns any data the thread may
# have produced.
$$thread->join();
}
}

$dbcon->disconnect;
}

[@more@]

……

sub processFiles
{
my ($etl_system,$etl_job,$etl_serv,$str_sql,$filename,$filepath) =@_;
# 每次创建线程处理文件之前,先检查当前已启动的线程数目是否小于最大允许数目
# 如果已经创建了足够多的线程,就不断地轮询
while(1)
{
if($CurrentThreads < $MaxThreads)
{
# 创建线程,传入参数
my $thread = threads->create('processFile',$etl_system,$etl_job,$etl_serv,$str_sql,$filename,$filepath);
# 创建一个thread以后要用join取得该thread的返回值,然后系统才会对thread进行清理,
# 否则所有thread的信息都会保留下来,当然越积越多了。对返回值不关心的时候要用detach显式剥离该thread。
push(@threads, $thread);
#$thread->detach();
last; # 退出循环
}
else
{
# 线程数达到最大时,等待一个时间段(120m):
LOG("线程数已到达最大值,sleep 120秒钟");
sleep 120;
}
}
}

……

sub processFile
{
## 当前新建的线程数加一:
{
lock($CurrentThreads);
$CurrentThreads++;
}

my ($etl_system,$etl_job,$etl_serv,$str_sql,$filename,$DesDataDir) = @_;

LOG("开始连接Oracle数据库,以获取$filename文件...n");
my $dbh = ConnectOra();
my $sth=$dbh->prepare($str_sql);
$sth->execute;
open(NEWFILE, "> $DesDataDir/$filename.dat") ;
LOG("开始获取$filename数据...n");

my @recs;
my @b_rows='';

while (@recs=$sth->fetchrow_array)
{
print NEWFILE @recs;
}
close(NEWFILE);
$dbh->disconnect;

log("$filename取数完成n");

## 当前活动的线程数减一:
{
lock($CurrentThreads);
$CurrentThreads--;
}
}

……

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16723161/viewspace-1016128/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16723161/viewspace-1016128/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值