再请教一下改成多线程,该怎么该啊
  ----- Original Message ----- 
  From: wbi 畢 
  To: [email protected] 
  Sent: Wednesday, August 19, 2009 11:01 AM
  Subject: [PerlChina] Re: 父子进程间变量共享


  进程间通信  一般都采用管道 
   
  你现在的思路适合改成多线程
   
  > Date: Tue, 18 Aug 2009 19:34:44 -0700
  > Subject: [PerlChina] 父子进程间变量共享
  > From: [email protected]
  > To: [email protected]
  > 
  > 请教各位一个问题。我有一个程序运行所需时间太长。因此我想编写一个多进程的版本,在父进程中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 访问该论坛
-~----------~----~----~----~------~----~------~--~---

回复