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

Perl 在Net::Server中断开客户端连接的最快方法,perl,Perl,我有一些脚本必须尽可能快(用作mpd5上/下脚本) 有这样的想法:让这个脚本将参数发送到某个tcp服务器并完成工作,然后服务器就可以长时间地工作 这是我与Net::server的测试服务器脚本: use Net::Server::PreForkSimple; use base "Net::Server::PreForkSimple"; sub process_request { my $self=shift; my $a=<STDIN>; clos

我有一些脚本必须尽可能快(用作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);
不太管用

我通过测试这个

echo test | nc 127.0.0.1 2000
这个命令正在工作50秒


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

您应该使用
$self->post\u process\u request
方法在关闭连接后执行代码

使用Net::Server::PreForkSimple;
使用base“Net::Server::PreForkSimple”;
子进程请求{
我的$self=shift;
我的$a=;
}
子后置处理请求{
$self->log(1,“开始$a”);
睡眠50;
$self->log(1,“完成$a”);
}

但是请记住,请求处理子进程在50秒内仍然不可用,因此,如果您希望尽可能快地处理多个请求,这可能不是适合您的解决方案,因为您可能会耗尽处理这些请求的子进程。在这种情况下,我建议使用类似或的消息队列。

在rt.cpan.org上发布此Q后,我得到了一个答案:

快速断开连接的正确代码为:

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);
使用base“Net::Server::PreForkSimple”;
子进程请求{
我的$self=shift;
我的$a=;
$self->post_process_request;
$self->log(1,“开始$a”);
睡眠50;
$self->log(1,“完成$a”);
}
__软件包->运行(端口=>2000);

post\u process\u请求是一个很好的答案-但要关闭客户端连接,您需要首先调用SUPER::post\u process\u请求,因为这是关闭客户端句柄的地方。更好的答案是将该代码扔到post_client_connection_钩子中,该钩子在客户端全部消失后处理

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");
}
子进程请求{
我的$self=shift;
$self->{'a'}=;
}
子post_客户端_连接_挂钩{
我的$self=shift;
my$a=$self->{'a'};
$self->log(1,“开始$a”);
睡眠50;
$self->log(1,“完成$a”);
}

I使用您的代码启动服务器,并在控制台中运行:echo test | nc 127.0.0.1 2000,结果是->在nc超时之前不断开连接。看起来不重要的是它是process_req还是post_processI通过使用目录:Queue来解决问题。这是另一种方式,但它的工作。感谢您将我引向消息队列
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");
}