请教各位一个问题。我有一个程序运行所需时间太长。因此我想编写一个多进程的版本,在父进程中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 讨论组”论坛。
 要在此论坛发帖,请发电子邮件到 [email protected]
 要退订此论坛,请发邮件至 [email protected]
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

回复