1

DBM::Deepそのため、異なるフォークプロセス間でデータを共有するために使用しています。DBM :: Deepオブジェクトを次のように設定しました:

my $todo = DBM::Deep->new(
    file      => "urls.db",
    locking   => 1,
    autoflush => 1,
    type      => DBM::Deep->TYPE_HASH
);

しかし、スクリプトを実行すると、次のエラーが発生するようです。

DBM::Deep: Cannot read sector at 673 in get_bucket_list() at new_forked_crawl.pl line 116
DBM::Deep: '30': Don't know what to do with type '' at new_forked_crawl.pl line 116
DBM::Deep: Cannot read sector at 1188 in get_bucket_list() at new_forked_crawl.pl line 116
DBM::Deep: '65536': Don't know what to do with type '' at new_forked_crawl.pl line 116
Can't locate object method "data" via package "DBM::Deep::Sector::File::BucketList" at /usr/lib/perl5/site_perl/5.8.8/DBM/Deep/Engine/File.pm line 160.

したがって、最後のエラーを除くすべてが行116に関係していますが、非常に奇妙なのは、行116が実際にはDBM :: Deep:とは関係がないことです。

    my $pid = fork();
    if($pid) { #line 116
        push(@forked_children,$pid);
    }
    #child process, do the work, son!
    elsif($pid == 0) {
        process_url($todo->{1}->{'urls_hash'}->{$url_id}{'url'},$url_id);
    } #end $pid else

だから私はこれが続くことは多くないことを知っていますが、誰かがこれらのエラーまたはこれに似たものに遭遇したことがありますか?DBM :: Deepの使用方法に関して私が見逃しているものはありますか?ありがとう!

4

1 に答える 1

4

この問題は、DBM::Deep オブジェクトのコピーを使用したことが原因であると思われます。子に新しい DBM::Deep オブジェクトを作成してみてください。通常は、子が作成されたときにそのようなオブジェクトが親に​​さえ存在しない方がよいでしょう。

于 2012-07-06T20:40:32.460 に答える