0

我正在尝试创建一个 Web 服务器,其请求被外包给隐藏在 open2() 后面的一组解释器,基于 cgi 参数中指示的“设备”。

问题是,我希望它是多线程的,但是我用来尝试跟踪与每个设备相关的事件队列的哈希不记得为每个请求创建的新设备:下面的服务器只打印这种事物:

Did not find default-device in (alreadyThere)...

Added default-device with Sun Oct 27 20:43:35 2013 to alreadyThere, default-device
Now... does (alreadyThere, default-device) persist for the next request?

这是脚本:

#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
use base qw(Net::Server::HTTP);

our $monkeys = shared_clone({ alreadyThere => { 'a' => 'b' } });

sub process_http_request {
    require CGI;
    my $cgi = CGI->new;
    my $device = $cgi->param('device') || 'default-device';

    print "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n<pre>";
    unless (exists $monkeys->{$device}) {
        print "Did not find $device in (".join(", ", sort keys %$monkeys).")...\n";
        lock $monkeys;
        unless (exists $monkeys->{$device}) {
            my $t = localtime;
            $monkeys->{$device} = $t;
            print "\nAdded $device with ".$t." to ".join(", ", sort keys %$monkeys);
        } else {
            print "\nSurprise device... ".$device;
        }
    } else {
        print "\nFound device... ".$device;
    }

    print "\nNow... does (".join(", ", sort keys %$monkeys).") persist for the next request?</pre>";
}

__PACKAGE__->run(port => 8080);

这不是 $t 位 - 以前是 shared_clone({ id => $t }),但如果我能明白为什么 $monkeys 似乎永远不会更新,我会很生气。

4

3 回答 3

2

不同的请求由不同的进程提供服务,而不是线程。

Net::Server 没有多线程“个性” [1],因此您将不得不使用不同的共享机制。


笔记:

  1. “在不久的将来,我们想添加一个‘线程’个性”
于 2013-10-27T22:51:06.933 回答
0

基于 Ikegami 的回答,我正在尝试使用此附加代码来伪造“线程”个性并取得一些成功(以及“open3”行为不端的一些问题):

sub default_server_type { 'Single' }

sub loop {
  my $self = shift;
  while( $self->accept ){
    async {
        $self->run_client_connection;
    };
    last if $self->done;
  }
}
于 2013-10-28T13:16:34.523 回答
0

a) 是否有任何理由使用 Net::Server::HTTP 而不是更高级别且更易于使用的 Plack?
b) 我最近不得不解决一个与此类似的问题,并决定将基于事件的 httpd 与AnyEvent(或更高的抽象,Coro)一起使用。Net::Server::Coro如果您需要替换代码,甚至需要大量罐装的基于 AnyEvent 的 httpd,如TwiggyFeersum等。

于 2013-10-28T17:27:09.267 回答