在Net :: Server中断开客户端的最快方法

时间:2012-05-04 09:52:37

标签: perl

我有一些脚本必须尽可能快(用作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秒。

但我希望在发送“test”后立即关闭nc。

3 个答案:

答案 0 :(得分: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等消息队列。

答案 1 :(得分:0)

我在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);

答案 2 :(得分: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");
}