2009年8月18日星期二

[PerlChina] 父子进程间变量共享

请教各位一个问题。我有一个程序运行所需时间太长。因此我想编写一个多进程的版本,在父进程中declarey几个hash。在循环中fork出的子进
程,对hash添加(key => value)对。循环结束后,再对hash中的数据操作。反映我思路的简单代码如下:
=========================================
#! /usr/bin/perl
use strict;
use warnings;

my @taskArrary = (1..200) ; # 200个任务
my (%hash1,%has2);
my %pid_task ;
my $maxp = 10 ; # 为了 同时不多于$maxp 个进程 ;

while(my $task = shift @taskArray ){

# 为了 同时不多于$maxp 个进程

if (scalar (keys %pid_task) >= $maxp ){
my $kid = wait ;
delete $pid_task{$kid} ;
}

# fork 子进程,并
if (my $pid = fork){
$pid_task{$pid} = $task ;
}else{
$hash1{$key1} = $value1 ;
$hash2{$key2} = $value2 ;
exit;
}
}

#等待所有的子进程结数;
while (my $kid = wait){
last if $kid < 0 ;
}


print join "\t", %hash1", "\n" ;
print join "\t", %hash1", "\n" ;

exit ;
=====================================
;
我碰到的问题是:
1)在子进程中添加的(key => value)对,在父进程中的hash中似乎丢失了。有没有方法可以使在子进程中对hash的操作,反映到父进程
中。

2)我试过子进程中用dbm与hash相连解决,
-------------------------------------
if (my $pid =fork){
...
} else{
dbmopen (%hash1, $dbmfile, 0644) ;
dbmopen (%hash1, $dbmfile, 0644) ;
...
dbmclose (%hash1) ;
dbmclose (%hash1) ;
}
---------------------------------
似乎运行正常,没有警告报错信息。但测试时结果与单进程的版本相比,这样所得的hash中的($key,$value)对要少一些,也就是有
些(key,value)还是没有传递到print 语句中的hash中去,

3)另外一个问题是,$maxp小于等于3时,似乎运行正常,没有警告报错信息。但大于等于4时,程序运行一段时间后就会导致机器关机。我的电脑是4核
的CPU,是不是因为内核不够多?


请指点谜径。谢谢!
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: