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

zou*_*oul 6 perl multithreading plack

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

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

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

zou*_*oul 4

我刚刚意识到\xe2\x80\x99s 有一个非常重要的区别,我忘记了:我\xe2\x80\x99t 不必等待作业完成才能响应HTTP 请求。这意味着 I\xe2\x80\x99m 可以使用Forks::Super

\n\n
#!/usr/bin/env perl\n\nuse strict;\nuse warnings;\nuse Forks::Super MAX_PROC => 1, ON_BUSY => \'queue\';\n\nmy $app = sub {\n    my $env = shift;\n    fork sub {\n        # lengthy operation\n    };\n    return [202, [\'Content-Type\'=>\'text/plain\', \'Content-Length\'=>8], ["Accepted"]];\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n