也许是因为子进程不知道我的哈希值(参见下面的代码),哈希%输出没有收集任何东西..除了编写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, 添
答案 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)
每个进程都有自己的内存,进程之间不共享数据。但是你有几个选择:
threads
与shared variables一起使用,而不是使用fork()DBD::CSV
)。这是使用临时文件的一种奇特方式。还有吗?我不知道如何使用内置的shmget
/ shmread
/ shmwrite
函数,或者它们在这里是否有用。其他评论者请随时编辑。