perl 多執行緒

miguelmin發表於2009-01-15

需要引入的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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章