我想要一个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;
答案 0 :(得分:2)
Randal Schwartz的Watching long processes through CGI应该有所帮助:
孩子继续,但必须首先关闭STDOUT,否则Apache会认为浏览器可能仍会有一些输出,并且在完全解决之前不会响应浏览器或释放连接。接下来,我们必须启动子进程以执行...
我们将在第37行使用包含隐式fork的管道打开来执行此操作。孙子进程将STDERR合并到STDOUT,然后执行...
子节点(即traceroute的父节点)从STDOUT(和STDERR)打开的文件句柄中读取...
简而言之,子进程急忙执行命令。 ...
鉴于您只对开始流程而不是观看流程感兴趣,您应该能够修剪大部分代码。