6

を使用して実行する単純な Plack アプリ ( Plack::App::GitHub::WebHookのようなもの) がありますplackup。リクエスト ハンドラーで長時間の操作を実行すると、現在、操作が完了するまでアプリが後続のリクエストに応答しなくなります。他のリクエストをブロックせずにバックグラウンドで操作を実行するにはどうすればよいですか? フォローアップの質問ですが、そのバックグラウンド キューで最大 1 つのジョブを実行し続けるにはどうすればよいですか?

私はlibdispatchに慣れているので、次のようなものが好きです:

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

1 に答える 1

4

忘れていた非常に重要な違いが 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"]];
};

リクエストの処理はすぐに終了し、長時間の操作はバックグラウンドで実行され、実行中の操作は常に 1 つだけです。Forks::Super複雑に見え、インストールに時間がかかるので、誰かが同様の機能を提供するより軽量なモジュールを知っていれば幸いです.

于 2014-01-07T19:01:56.510 に答える