我如何强迫Mojolicious向客户发送回复?

时间:2013-07-25 21:29:42

标签: perl mojolicious

我想要一个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;

1 个答案:

答案 0 :(得分:2)

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

  

孩子继续,但必须首先关闭STDOUT,否则Apache会认为浏览器可能仍会有一些输出,并且在完全解决之前不会响应浏览器或释放连接。接下来,我们必须启动子进程以执行...

     

我们将在第37行使用包含隐式fork的管道打开来执行此操作。孙子进程将STDERR合并到STDOUT,然后执行...

     

子节点(即traceroute的父节点)从STDOUT(和STDERR)打开的文件句柄中读取...

     

简而言之,子进程急忙执行命令。 ...

鉴于您只对开始流程而不是观看流程感兴趣,您应该能够修剪大部分代码。