首页 > 解决方案 > 设置不活动超时 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);
        },[], 
     );
}

链接:

不活动超时

子进程

标签: perlmojolicious

解决方案


这是一个最小的例子:

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


推荐阅读