【发布时间】:2024-01-02 13:42:02
【问题描述】:
是否可以使用 Parallel::ForkManager 为 fork 实现某种超时(时间限制)?
基本的 Parallel::ForkManager 脚本如下所示
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new( 10 );
for ( 1 .. 1000 ) {
$pm->start and next;
# some job for fork
$pm->finish;
}
$pm->wait_all_children();
我想限制“# some job for fork”的时间。例如,如果它没有在 90 秒内完成。那么它(叉子)应该被杀死/终止。 我想到了using this,但我不得不说,我不知道如何将它与 Parallel::ForkManager 一起使用。
编辑
感谢 hobbs 和 ikegami。您的两个建议都有效.....但仅在这个基本示例中,而不是在我的实际脚本中:(。 这些叉子将永远存在,而且 - 老实说 - 我不知道为什么。我使用这个脚本几个月。没有改变任何东西(尽管很多事情取决于外部变量)。 每个分叉都必须从网站下载页面,对其进行解析并将结果保存到文件中。每个分叉的时间不应超过 30 秒。超时设置为 180 秒。那些吊叉是完全随机的,因此很难追踪问题。这就是为什么我想出了一个临时的、简单的解决方案 - 超时和终止。
什么可能会禁用(中断)我的代码中的超时方法?我的代码中没有任何其他alarm()。
编辑 2
其中一个叉子挂了 1 小时 38 分钟并返回“超时 PID”——这是我在 die() 中输入的 alarm()。所以超时工作......但它迟到了大约 1h36,5m ;)。你有什么想法吗?
【问题讨论】:
-
Re: 编辑 2,你在使用 LWP::UA 吗?如果是这样,请参阅此处:*.com/questions/73308
-
“这是我在 die() 中为 alarm() 输入的内容”是什么意思?
-
@pilcrow 我正在使用 LWP::UA(通过 WWW::Mechanize)。早些时候,当我跟踪这个问题时,我在 WWW::Mech http 请求上测试了“超时”。超时有效,但叉子还是挂了。
-
@ikegami 我在
eval{ }之后有if ($@) { die "timeout $$\n"; }(from this example。对不起我的英语,它很糟糕,有时我很难解释一些事情;)。 -
嗯?这与警报无关。但这并不重要。你刚才说你使用LWP,它使用
alarm,消除你的警报。
标签: perl parallel-processing timeout fork