3

我希望对 Mojolicious 应用程序的请求能够触发长时间运行的作业。客户不需要等待那个漫长的工作完成,所以我希望应用程序发回快速响应并开始工作。这是我的想法:

use Mojolicious::Lite;
get '/foo' => sub {
    my $self = shift;
    $self->render( text => 'Thanks for requesting /foo. I will get started on that.' );
    # ... force Mojolicious to send response now ...
    do_long_running_job();
};

但是当我编写这样的代码时,客户端直到长时间运行的作业完成后才会收到响应(这可能会触发不活动超时等)。有什么方法可以更快地发送响应吗?有没有另一种方法来构建我的代码/应用程序来实现这一点?

文档中看起来很有希望但没有用的东西:

$self->rendered(200);
$self->res->finish;
4

1 回答 1

2

Randal Schwartz 的Watching long processes through CGI应该有助于:

子进程继续,但它必须先关闭 STDOUT,否则 Apache 会认为浏览器可能仍有一些输出,并且在这一切都解决之前不会响应浏览器或释放连接。接下来,我们要启动child的一个子进程来执行……</p>

我们将在第 37 行使用包含隐式分叉的管道打开来执行此操作。孙进程将 STDERR 合并到 STDOUT,然后执行……</p>

子进程(即 traceroute 的父进程)读取从 STDOUT(和 STDERR)打开的文件句柄……</p>

简而言之,子进程匆忙执行命令。…</p>

鉴于您只对启动一个进程而不是观看它感兴趣,您应该能够修剪大部分代码。

于 2013-07-25T23:53:53.193 回答