我有一些脚本必须尽可能快(用作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。
答案 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秒,因此如果您想尽快处理许多请求,这可能不适合您,因为您可能会用尽子进程处理这些请求的进程。在这种情况下,我建议使用Gearman或beanstalkd等消息队列。
答案 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");
}