【问题标题】:Dancer2 (Perl): launching an external Program in the backgroundDancer2 (Perl):在后台启动外部程序
【发布时间】: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


【解决方案1】:

老问题,但以下对我来说效果很好 - 使用 & 让 shell 在后台运行命令。这会立即将控制权返回给路由处理程序,并且命令会在后台运行。

Perl:

post '/run-slow-script-in-background' => sub {
    my $slow_command = q{/full/path/to/slow/script --arg1 what --arg2 ever &};
    system($slow_command);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2015-03-29
    相关资源
    最近更新 更多