Perl Parallel :: Forkmanager不允许收集变量值

时间:2010-06-22 05:39:24

标签: perl asynchronous parallel-processing

也许是因为子进程不知道我的哈希值(参见下面的代码),哈希%输出没有收集任何东西..除了编写tmp文件之外还有其他方法来收集值吗?

foreach $Item (@AllItems) {
$pid = $pm->start($Item) and next;
$Temp = qx($Item);
$output{$Item}= $Temp; // This doesn't collect anything. :-(
$pm->finish;
}

$pm->wait_all_children;

TIA, 添

2 个答案:

答案 0 :(得分:7)

分叉进程有自己的父进程内存副本(好吧,写时拷贝)。写入子进程中的哈希不会影响父进程中的哈希。

要做你想做的事,你需要使用某种IPC。有关各种可能性的详细讨论,请参阅perlipc联机帮助页。

对于这样的事情,我可能会使用像磁盘上的哈希那样简单的东西。 DB_File提供了一个很好的绑定哈希接口。您可以这样做:

use strict;
use warnings;

use DB_File;

tie my %output, "DB_File", "output.dat" ;

foreach my $item( @AllItems) { 
    my $pid = $pm->start and next;
    $output{$item} = qx($item);
    $pm->finish;
}

答案 1 :(得分:2)

每个进程都有自己的内存,进程之间不共享数据。但是你有几个选择:

  1. 如您所建议的那样,将子进程中的数据写入要在父级中读取的临时文件
  2. 使用套接字或管道来完成同样的事情
  3. threadsshared variables一起使用,而不是使用fork()
  4. 使用共享内存工具(例如,请参阅this question
  5. 使用轻量级数据库(SQLLite,可能是DBD::CSV)。这是使用临时文件的一种奇特方式。
  6. 还有吗?我不知道如何使用内置的shmget / shmread / shmwrite函数,或者它们在这里是否有用。其他评论者请随时编辑。