1

我正在使用 perl 的Forks::Super模块来控制我一次分叉的进程数量。这是我的代码:

for(....) {
    my $pid = fork { max_proc => 10, on_busy=> "queue", sub => \&process_url, args=>[$url_h,$q_fh,$q_filename,$urls->{$url_h->{'url_id'}},\%fh] };
}
waitall;

但是,问题是,假设我从循环中的 100 个项目开始(每个项目都写入一个文件),在循环之后的 waitall 之后,我可能只有 60 行写入文件中。有谁知道是什么问题?我是文件锁定,所以这不应该是问题。谢谢!

4

1 回答 1

1

我对 Forks::Super 了解不多,但是从文档中我认为应该这样写:

$Forks::Super::ON_BUSY = 'queue';
$Forks::Super::MAX_PROC = 10;
for(....) {
    my $pid = fork { sub => \&process_url, args=>[$url_h,$q_fh,$q_filename,$urls->{$url_h->{'url_id'}},\%fh] };
}
waitall;

我认为最好在没有文件句柄的情况下编写它。使用文件和锁在进程之间共享数据不是很有效。

要在 linux 中的进程之间共享数据,您可以使用:Cache::FastMmap。使用已知的 share_file,你会很好。

于 2012-11-19T08:31:12.957 回答