2009-10-14 133 views
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 ; 

我正在尝试使用并行分支管理器模块访问并行进程上的全局变量。程序结束时全局变量仍然保持不变。如何实现这一点?是否有可能?Perl如何在并行处理中共享全局变量?

+0

为什么你想要分享变量吗?在开始这个过程之后它们是否改变了? – 2009-10-15 01:08:38

回答

3

如果程序未开始并行处理,则问题将是与第二

my $a = 0; 

线。

但是,由于您正在开始并行进程,因此每个$a都将位于其内存空间中。这意味着每个$a是第一个$a的副本。而最后的第一个$a永远不会改变,因为这一点。

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

+0

对不起,我已经编辑过了 – joe 2009-10-14 08:32:36

+0

@joe,你的编辑不会改变任何东西,$ a的范围仍然是相同的。我或我们的问题,IPC问题依然存在。你的分叉进程正在完成他们的工作,而不会在结束后保存任何可以保存的结果。 – EmFi 2009-10-14 08:39:36

+1

你的改变并不重要,因为你是分叉的,所有的变量都在不同的过程中。 – 2009-10-14 08:40:34

9

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

如果你想分享整个并行的工人变量,那么你就需要看看或者使用线程(我不推荐),或使用一些类似IPC::Shareable

0
排序IPC(进程间通信)的

我使用的窍门 - 将叉子过程中的每个变量保存到单独的txt文件中,而不是在最后(叉子后)只是去搜索所有文件并收集它们(如果不需要,可以删除文件..