1

できるだけ高速でなければならないスクリプトがいくつかあります(mpd5アップ/ダウンスクリプトとして使用されます)。

アイデアを持ってください:このスクリプトがいくつかのtcpサーバーに引数を送信して作業を終了すると、サーバーは懸命に長く動作します。

これは、Net :: Serverを使用したテストサーバースクリプトです:

use Net::Server::PreForkSimple;
use base "Net::Server::PreForkSimple";

  sub process_request {
     my $self=shift;
     my $a=<STDIN>;
     close STDIN; close STDOUT; #trying to disconect client here
     $self->log(1,"start $a");
     sleep 50;
     $self->log(1,"finish $a");
      }
__PACKAGE__->run(port => 2000);

問題は次のとおりです。$a=の後にオンラインでクライアントを切断する方法がわかりません。このすべての「スリープ50」を待機しているクライアントスクリプト。STD *を閉じようとしていますが、効果がありません。また、このNet::Serverのドキュメントでcloseまたはdisconectメソッドを見つけることができません。

誰かが私を正しい方向に向けることができますか?

UPD:

close($self->{server}->{client});

あまりにも動作しません。

私はこれをテストします

echo test | nc 127.0.0.1 2000

このコマンドは50秒機能します。

しかし、「テスト」を送信した直後にncを閉じたい。

4

3 に答える 3

1

$self->post_process_request接続を閉じた後、このメソッドを使用してコードを実行する必要があります。

use Net::Server::PreForkSimple;
use base "Net::Server::PreForkSimple";

sub process_request {
    my $self=shift;
    my $a=<STDIN>;
}

sub post_process_request {
    $self->log(1,"start $a");
    sleep 50;
    $self->log(1,"finish $a");
}

ただし、子プロセスを処理するリクエストは50秒間使用できないため、処理する子プロセスが不足する可能性があるため、できるだけ多くのリクエストを処理する場合は、これが適切なソリューションではない可能性があることに注意してください。これらのリクエスト。この場合、Gearmanbeanstalkdのようなメッセージキューをお勧めします。

于 2012-05-04T11:19:12.740 に答える
1

このQをrt.cpan.orgに投稿した後、答えが返ってきます。

高速切断の正しいコードは次のとおりです。

use base "Net::Server::PreForkSimple";

sub process_request {
    my $self = shift;
    my $a = <STDIN>;
    $self->post_process_request;
    $self->log(1,"start $a");
    sleep 50;
    $self->log(1,"finish $a");
}
__PACKAGE__->run(port => 2000);
于 2012-06-01T01:47:33.250 に答える
0

post_process_requestは良い答えですが、クライアント接続をシャットダウンするには、最初にSUPER :: post_process_requestを呼び出す必要があります。これは、クライアントハンドルがシャットダウンされる場所だからです。より良い答えは、クライアントがすべてなくなった後に処理するpost_client_connection_hookにそのコードをスローすることです。

sub process_request {
    my $self = shift;
    $self->{'a'} = <STDIN>;
}

sub post_client_connection_hook {
    my $self = shift;
    my $a = $self->{'a'};
    $self->log(1,"start $a");
    sleep 50;
    $self->log(1,"finish $a");
}
于 2012-06-01T04:39:04.447 に答える