6

我有一个简单的 Plack 应用程序(类似于Plack::App::GitHub::WebHook),我使用plackup. 我在请求处理程序中执行了一个冗长的操作,这使得应用程序在操作完成之前无法响应后续请求。如何在后台执行操作而不阻塞其他请求?还有一个后续问题,我怎样才能让后台队列中最多运行一个作业?

我习惯了libdispatch,所以我喜欢这样的东西:

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

1 回答 1

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看起来很复杂并且需要很长时间才能安装,所以如果有人知道提供类似功能的更轻量级的模块,我会很高兴。

于 2014-01-07T19:01:56.510 回答