我花了大约6个小时试图解决这个问题。我希望perl guru会有所帮助。
我有一个程序循环,用我正在轮询的服务器的信息更新哈希。我正在使用HTTP :: Server :: Simple :: CGI向用户报告此信息。我遇到的问题是HTTP :: Server :: Simple :: CGI模块不会看到哈希的更新,只会报告哈希初始化的数据。
我有以下代码,删节:
{
package LabBrowser;
use warnings;
use strict;
use Thread::Queue;
use LWP::Simple;
use HTTP::Server::Simple::CGI;
use base qw(HTTP::Server::Simple::CGI);
my %problem_data_structure;
sub server_loop {
while(1) {
for my $server (@server_list) {
fetch_server_info(@$server);
}
}
}
sub fetch_server_info {
my ($hostname, $port) = @_;
my $content = fetch_webpage_content("http://" . $hostname . ":" . $port);
my @data = parse_data(content);
$problem_data_structure{$hostname} = [@data];
}
##THIS SUB
sub handle_request {
my ($self, $cgi) = @_;
my $path = $cgi->path_info();
##THIS LINE
print Data::Dumper->Dump([\%problem_data_structure],['handle']);
}
}
my $pid = LabBrowser->new(8080)->background();
my $labBrowser = LabBrowser->init();
$labBrowser->server_loop();
print "$pid !!!\n";
除了handle_request之外,我可以在程序中的任何位置获取%problem_data_structure中的数据。在那里,似乎它只知道变量被初始化的内容。如果我在开头添加一些键值对,它会报告。但是,它不会报告自初始化以来添加到数据结构的任何内容。
有谁知道发生了什么事?
答案 0 :(得分:1)
background()
是在后台进程中处理请求的线索。 Perl中的进程不共享内存,因此在%problem_data_structure
中修改handle_request
时,父进程中%problem_data_structure
的(原始)副本不会受到影响。