perl - 设置不活动超时 Perl (Mojo) 子进程
问题描述
我有一个 Perl Mojo 服务器正在运行,当发布到某个 url 时,有一个脚本可以为一个很长的进程(大约一分钟的时间)创建一个子进程。
此过程运行大约 30 秒然后崩溃,这里没有抛出异常或生成任何日志。
我的自然假设是这与连接超时有关,所以我增加了服务器的超时。话虽这么说,我很有信心这与服务器进程无关,而是 perl 脚本本身超时。
我在子流程页面上遇到了文档,上面写着:
请注意,它不会增加连接的超时时间,因此如果您的分叉进程需要很长时间,您可能需要使用 Mojolicious::Plugin::DefaultHelpers 中的“inactivity_timeout”来增加它。
DefaultHelpers 文档说:
不活动超时
$c = $c->inactivity_timeout(3600);
在 Mojo::IOLoop 中使用“流”来查找当前连接并尽可能增加超时。
更长的版本
Mojo::IOLoop->stream($c->tx->connection)->timeout(3600);
但我不确定如何(或在哪里)定义不活动超时,或者文档中的 $c 变量是什么。
我的代码:
sub long_process{
my ($self) = @_;
my $fc = Mojo::IOLoop::Subprocess->new;
$fc->run(
sub {
my @args = @_;
sleep(60);
},[],
);
}
链接:
解决方案
这是一个最小的例子:
use Mojolicious::Lite;
get '/',
sub {
my $c = shift;
say Mojo::IOLoop->stream($c->tx->connection)->timeout;
$self->inactivity_timeout(60);
say Mojo::IOLoop->stream($c->tx->connection)->timeout;
my $fc = Mojo::IOLoop::Subprocess->new;
$fc->run(
sub {
my @args = @_;
sleep(20);
return 'Hello Mojo!';
},
sub {
my ($subprocess, $err, $result) = @_;
say $result;
$c->stash(result => $result);
$c->render(template => 'foo');
}
);
};
app->start;
__DATA__
@@ foo.html.ep
%== $result
传递给的第二个回调run()
在子进程完成时进行处理。有关详细信息,请参阅Mojo::IOLoop::Subprocess。
推荐阅读
- android - Flutter 将 Activity 添加到 Android Manifest for ImageCropper
- java - 从 httpheader JAVA 中获取对象键的数组值
- python - 在基于 Django 类的视图中访问主键
- arrays - 反应数组未正确映射
- sql - 如何从表中获取前一个非 0 值?
- firebase - Flutter 如何将 Image 数据类型转换为 File 数据类型?
- terminal - 错误:运行终端时必须设置 CONDA_BUILD_SYSROOT 或 SDKROOT 以进行交叉编译
- javascript - 我将如何计算每个表格行中出现的唯一单词的频率并显示在同一行的选定单元格中计数?
- r - 如何编写 Bray-Curtis 函数?
- ruby-on-rails - 如何保存授权码和领域 ID 以获得访问和刷新令牌?