设置不活动超时 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);
        },[], 
     );
}

链接:

inactivity_timeout

subprocess

这是一个最小的例子:

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