【发布时间】:2019-03-04 05:58:08
【问题描述】:
我写了一个简单的网络服务器,它应该不断地处理同时的请求。但是,即使在分离线程之后,它也不会处理同时请求。有人可以帮忙吗?
网络服务器.pl
use HTTP::Daemon;
use threads;
my $webServer;
my $package_map = {"test" => "test"};
my $d = HTTP::Daemon->new(LocalAddr => $ARGV[0],
LocalPort => 80,
Listen => 20) || die;
print "Web Server started!\n";
print "Server Address: ", $d->sockhost(), "\n";
print "Server Port: ", $d->sockport(), "\n";
while (my $c = $d->accept) {
threads->create(\&process_req, $c)->detach();
}
sub process_req {
my $c = shift;
my $r = $c->get_request;
if ($r) {
if ($r->method eq "GET") {
my $path = $r->url->path();
my $service = $package_map->{$path};
if ($service) {
$response = $service->process_request($request);
}
}
}
$c->close;
undef($c);
}
test.pm
sub process_request
{
threads->create(\&testing)->detach();
my $response = HTTP::Response -> new (200);
$response -> header('Access-Control-Allow-Origin', '*');
$response -> content("Success");
return $response;
}
sub testing
{
my $command = 'echo "sleep 100" | ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 <dev_box>';
if (system($command) != 0) {
print "FAILED\n";
}
}
【问题讨论】:
-
您应该添加一些
print语句,以便查看网络服务器挂起的位置。 HTTP::Daemon 建议一个连接的 while 循环:while (my $r = $c->get_request) { -
它没有挂起,而是休眠 100 秒,然后再次开始接受请求。
-
我无法复制您的问题。当用
sleep 100替换您的子模块并实际调用$c->send_response()时,我可以连接至少三个并行HTTP 请求,每个请求在100 秒后得到处理。我将在下面发布工作代码作为回复。 -
perl -v | grep 'This is' ; perl -V:useithreads的输出是什么?
标签: multithreading perl http-daemon