我有一个简单的Plack应用程序(类似Plack::App::GitHub::WebHook),我使用plackup
运行。我在请求处理程序中执行了一个冗长的操作,该操作程序当前使应用程序对后续请求没有响应,直到操作完成。如何在不阻止其他请求的情况下在后台执行操作?还有一个后续问题,如何在后台队列中保留最多一个作业?
我习惯libdispatch,所以我喜欢这样的事情:
my $queue = Hypothetical::Concurrency::Queue->new(max_jobs => 1);
$queue->dispatch(sub {
# code
});
答案 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
看起来很复杂,需要很长时间才能安装,所以如果有人知道更轻量级的模块提供类似的功能,我会很高兴。