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 に答える