Perl 在Net::Server中断开客户端连接的最快方法
我有一些脚本必须尽可能快(用作mpd5上/下脚本) 有这样的想法:让这个脚本将参数发送到某个tcp服务器并完成工作,然后服务器就可以长时间地工作 这是我与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
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");
}