崩溃我已经使用WWW::Mechanize
编写了一个Perl脚本,它从文本文件中读取URL并逐一连接到它们。在每个操作中,它会分析寻找某些特定关键字的网页内容,如果找到,它将被写入输出文件。Perl使用Parallel :: ForkManager和WWW :: Mechanize
为了加快这个过程,我用Parallel::ForkManager
和MAX_CHILDREN
设置为3
。尽管我观察到速度有所提高,但问题是,一段时间后脚本崩溃了。 Perl.exe
进程被终止并且不显示任何特定的错误消息。
我已经多次运行该脚本以查看它是否总是在同一点上失败,但是失败点似乎是间歇性的。
请注意,我已经照顾任何内存泄漏的WWW::Mechanize
和HTML::TreeBuilder::XPath
如下:
- 对于
WWW::Mechanize
,我设置stack_depth(0)
,这样它不缓存访问过的网页的历史记录。 HTML::TreeBuilder::XPath
,我完成后就删除根节点。这种方法帮助我解决了另一个不使用fork
的类似脚本中的内存泄漏问题。
这里是脚本,我这里提到的只是相关部分的结构,请让我知道,如果需要更多的信息来解决:
#! /usr/bin/perl
use HTML::TreeBuilder::XPath;
use WWW::Mechanize;
use warnings;
use diagnostics;
use constant MAX_CHILDREN => 3;
open(INPUT,"<",$input) || die("Couldn't read from the file, $input with error: $!\n");
open(OUTPUT, ">>", $output) || die("Couldn't open the file, $output with error: $!\n");
$pm = Parallel::ForkManager->new(MAX_CHILDREN);
$mech=WWW::Mechanize->new();
$mech->stack_depth(0);
while(<INPUT>)
{
chomp $_;
$url=$_;
$pm->start() and next;
$mech->get($url);
if($mech->success)
{
$tree=HTML::TreeBuilder::XPath->new();
$tree->parse($mech->content);
# do some processing here on the content and print the results to OUTPUT file
# once done then delete the root node
$tree->delete();
}
$pm->finish();
print "Child Processing finished\n"; # it never reaches this point!
}
$pm->wait_all_children;
我想知道,为什么这个Perl脚本会在一段时间后失败? 为了理解目的,我在fork管理器的完成方法之后添加了一个print语句,但它不打印它。 我也使用过,wait_all_children
方法,因为根据CPAN上的模块的文档,它将等待处理过程来完成父进程的所有子进程。
我没有理解原因,wait_all_children
方法是while
以外的地方或for
环路虽然(如文档中观察到的为好),因为所有的处理正在循环内发生。
谢谢。
嗨,谢谢你的帮助。我试着放置try和catch块来查看错误消息的更多细节,但它不起作用。我甚至尝试在其中包含更多的代码,但这会使脚本更早失败,而不会提供任何错误消息细节。 – 2012-08-04 03:11:43
try块只是试图揭示问题。如果不能看到'#在这里做些什么处理“,那么除了这些之外,很难提供更多的帮助。这里的分叉使得一些调试变得单调乏味。你可以添加一些警告语句,比如'warn'[$$]在机器得到\ n“'和'warn”之后[$$]在树删除\ n“'后了解它失败的位置。 '$$'可以让您按照子进程ID对警告日志条目进行分组。 – zostay 2012-08-04 11:31:49
如果我通过私人信息向你发送剧本,你可以吗? – 2012-08-05 13:08:57