设置不活动超时Perl(Mojo)子进程

问题描述 投票:2回答:1

我有一个运行的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);
        },[], 
     );
}

链接:

inactivity_timeout

subprocess

perl mojolicious mojo
1个回答
0
投票

这里是一个最小的示例:

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()的第二个回调在子流程完成时进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.