【问题标题】:How do I run a Plack request handler in background?如何在后台运行 Plack 请求处理程序?
【发布时间】:2014-01-25 12:26:55
【问题描述】:

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

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

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

【问题讨论】:

  • 第一个你需要一个多进程 plack 服务器(starman 很流行),第二个需要某种形式的锁。

标签: multithreading perl plack


【解决方案1】:

我刚刚意识到我忘记了一个非常重要的区别:我不必等待作业完成来响应 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 看起来很复杂并且需要很长时间才能安装,所以如果有人知道提供类似功能的更轻量级的模块,我会很高兴。

【讨论】:

  • 在这种情况下,202 Accepted 可能是比200 OK 更好的选择?
猜你喜欢
  • 2015-06-17
  • 2020-04-13
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多