如何在后台运行Plack请求处理程序?

时间:2014-01-07 17:33:14

标签: multithreading perl plack

我有一个简单的Plack应用程序(类似Plack::App::GitHub::WebHook),我使用plackup运行。我在请求处理程序中执行了一个冗长的操作,该操作程序当前使应用程序对后续请求没有响应,直到操作完成。如何在不阻止其他请求的情况下在后台执行操作?还有一个后续问题,如何在后台队列中保留最多一个作业?

我习惯libdispatch,所以我喜欢这样的事情:

my $queue = Hypothetical::Concurrency::Queue->new(max_jobs => 1);
$queue->dispatch(sub {
    # code
});

1 个答案:

答案 0 :(得分:4)

我刚刚意识到我忘记了一个非常重要的区别:我不必等待工作完成以响应HTTP请求。这意味着我可以使用Forks::Super

#!/usr/bin/env perl

use strict;
use warnings;
use Forks::Super MAX_PROC => 1, ON_BUSY => 'queue';

my $app = sub {
    my $env = shift;
    fork sub {
        # lengthy operation
    };
    return [202, ['Content-Type'=>'text/plain', 'Content-Length'=>8], ["Accepted"]];
};

现在服务请求立即完成,长操作在后台运行,并且总是最多其中一个运行。 Forks::Super看起来很复杂,需要很长时间才能安装,所以如果有人知道更轻量级的模块提供类似的功能,我会很高兴。