1

我有一些必须尽可能快的脚本(用作 mpd5 up/down 脚本)。

有这个想法:让这个脚本将参数发送到某个 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($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

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