再请教一下改成多线程,该怎么该啊 ----- 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 访问该论坛 -~----------~----~----~----~------~----~------~--~---
