设置不活动超时 Perl (Mojo) 子流程
Set Inactivity Timeout Perl (Mojo) Subprocess
我有一个 Perl Mojo 服务器 运行,当发布到某个 url 时,有一个脚本可以为一个很长的进程(大约一分钟的时间)创建一个子进程。
这个进程运行了大约 30 秒然后崩溃,这里没有抛出异常或生成任何日志。
我的自然假设是这与连接超时有关,所以我增加了服务器的超时时间。话虽如此,我非常有信心这与服务器进程无关,而是 perl 脚本本身超时。
我看到子流程页面上的文档说:
Note that it does not increase the timeout of the connection, so if your forked process is going to take a very long time, you might need to increase that using "inactivity_timeout" in Mojolicious::Plugin::DefaultHelpers.
DefaultHelpers 文档说:
inactivity_timeout
$c = $c->inactivity_timeout(3600);
Use "stream" in Mojo::IOLoop to find the current connection and increase timeout if possible.
Longer version
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。
我有一个 Perl Mojo 服务器 运行,当发布到某个 url 时,有一个脚本可以为一个很长的进程(大约一分钟的时间)创建一个子进程。
这个进程运行了大约 30 秒然后崩溃,这里没有抛出异常或生成任何日志。
我的自然假设是这与连接超时有关,所以我增加了服务器的超时时间。话虽如此,我非常有信心这与服务器进程无关,而是 perl 脚本本身超时。
我看到子流程页面上的文档说:
Note that it does not increase the timeout of the connection, so if your forked process is going to take a very long time, you might need to increase that using "inactivity_timeout" in Mojolicious::Plugin::DefaultHelpers.
DefaultHelpers 文档说:
inactivity_timeout
$c = $c->inactivity_timeout(3600);
Use "stream" in Mojo::IOLoop to find the current connection and increase timeout if possible.
Longer version
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。