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 ;
我试图使用并行fork Manager模块访问并行进程上的全局变量。程序结束时全局变量仍然保持不变..如何实现这一目标?是否有可能?
答案 0 :(得分:9)
这不是范围问题,而是一个不同的过程问题。 Parallel::ForkManager使用fork()(因此得名)。这意味着并行运行的每个版本实际上是一个单独的进程(perl解释器的单独调用),因此是单独的内存。变量在每个进程中都具有相同的名称,但它们不会指向内存中的相同位置。
如果你想在并行工作者之间共享变量,那么你需要查看使用线程(我不建议使用)或使用某种IPC(进程间通信),如IPC::Shareable
答案 1 :(得分:3)
如果程序没有启动并行进程,则问题出在第二个
my $a = 0;
线。
但是,因为您正在启动并行进程,所以每个$a
都将位于其内存空间中。这意味着每个$a
都是第一个$a
的副本。由于这个原因,最后一个$a
永远不会改变。
从一个进程获取值到另一个进程需要进行一些进程间通信。这可以通过套接字或 IPC 或其他一些机制来完成。
答案 2 :(得分:1)
我使用的技巧 - 将fork进程中的每个变量保存到单独的文本文件中,然后在结束时(在fork之后)只需浏览所有文件并收集它们(如果不需要,可以删除文件..