3
  use Parallel::ForkManager;
  use LWP::Simple;
  my $pm=new Parallel::ForkManager(10);
  our $a =0;
 @LINK=( 10,203, 20, 20 ,20 ,10 ,101 ,01 ,10 ) ;
  for my $link (@LINK) {
    $pm->start and next;
    my $lo = ($link * 120.22 )*12121.2121212121212121*( 12121212.1212121+ $link);
    $a = $a+ $lo ;   
    print $a."\n" ; 
    $pm->finish;
  };

  print $a ; 

我试图使用并行分叉管理器模块访问并行进程上的全局变量。程序结束时全局变量仍然保持不变..如何实现这一点?是否有可能?

4

3 回答 3

9

这不是范围界定的问题,而是不同流程的问题。Parallel::ForkManager使用 fork() (因此得名)。这意味着并行运行的每个版本实际上是一个单独的进程(对 perl 解释器的单独调用),因此是单独的内存。每个进程中的变量将具有相同的名称,但它们不会指向内存中的相同位置。

如果您想在并行工作人员之间共享变量,那么您需要考虑使用线程(我不推荐)或使用某种 IPC(进程间通信),如IPC::Shareable

于 2009-10-14T13:49:17.717 回答
3

如果程序没有启动并行进程,那么问题出在第二个

my $a = 0;

线。

但是,因为您正在启动并行进程,所以每个进程都$a将在它的内存空间中。这意味着每个$a都是第一个的副本$a。最后一个$a永远不会改变,正因为如此。

从一个进程获取值到另一个进程需要一些进程间通信。这可以通过套接字IPC或其他一些机制来完成。

于 2009-10-14T08:30:49.963 回答
1

我使用的技巧 - 将 fork 过程中的每个变量保存到单独的 txt 文件中,而不是在最后(在 fork 之后)只是遍历所有文件并收集它们(如果不需要,您可以删除文件..

于 2010-01-22T20:39:33.183 回答