【发布时间】:2016-12-10 07:40:47
【问题描述】:
我使用 Dancer2 制作了一个 Web 应用程序。我需要根据 ajax 请求调用外部程序。问题是请求会冻结,直到程序完成。我尝试了一些方法,例如在系统调用和 fork 中使用 &,但没有成功。
这是简化的代码:
Perl:
package Test::App;
use Dancer2;
our $VERSION = '0.1';
get '/' => sub {
template 'index';
};
get '/startscript' => sub{
my $pid = fork();
$SIG{CHLD} = 'IGNORE';
if($pid == 0) {
`sleep 10`;
exit 0;
}
};
get '/gettest' => sub{
return "test"
};
true;
javascript:
$(document).ready(function() {
jQuery.get('/startscript', getSomething);
});
function getSomething(data){
jQuery.get('/gettest', getSomething);
console.log(data);
}
【问题讨论】:
-
什么部分冻结?前端的浏览器,还是后端的东西?对于后端,您如何运行您的应用程序?使用单个进程(即 perl app.pl)还是使用具有多个进程的 PSGI 服务器?你用 Dancer2 研究过 AnyEvent 吗?在this talk SawyerX 结尾的某处,正在谈论将异步 AnyEvent 与 D2 一起使用。我找不到任何更新的东西,但在某个地方有关于它的东西。
-
我认为它的后端,因为浏览器等待响应正好 10 秒。我的应用程序使用 PSGI 在 apache 上运行,但我也尝试使用 plackup 启动它。我会看看 AnyEvent。
-
我不确定如果你从 D2 进程中分叉会发生什么,但感觉不对。您可以使用支持多个进程的 PSGI 服务器部署您的应用程序,然后执行系统调用。这将使其仅阻止其中一个进程。但我认为最好的方法是研究 AnyEvent 的东西。
标签: javascript perl web-applications dancer