我有一个运行的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);
但是我不太确定如何(或where)定义不活动超时,或者文档中$ 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 $self = shift;
say Mojo::IOLoop->stream($self->tx->connection)->timeout;
$self->inactivity_timeout(60);
say Mojo::IOLoop->stream($self->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;
$self->stash(result => $result);
$self->render(template => 'foo');
}
);
};
app->start;
__DATA__
@@ foo.html.ep
%== $result
传递给run()
的第二个回调在子流程完成时进行处理。