2014-03-03 11 views
1

我想擁有一個可以通過Net :: Server實例訪問的共享連接池。不幸的是,IPC :: Shareable不允許我存儲連接,因爲它們是代碼引用。這是代碼的精簡版:Perl:使用IPC :: Shareable來彙集Net :: Server連接

use IPC::Shareable (':lock'); 
use parent 'Net::Server::Fork'; 
use MyConnectClass; 

sub login { 
    return MyConnectClass->new(); 
}; 

my %connection; 
tie %connection, 'IPC::Shareable', 'CONN', { 
    'create' => 1, 
    'exclusive' => 0, 
    'mode'  => 0666, 
    'destroy' => 'yes', 
} 
or croak 'Can not tie connection variable'; 

sub add_connection { 
    my $id = shift(@_); 
    my $con = shift(@_); 
    $connection{$id} = $con; 
}; 

sub get_connection { 
    my $id = # .. find unused connection 
    return $connection{$id}; 
} 

sub process_request { 
    my $self  = shift(@_); 

    eval { 
    my $connection = get_connection(); 
    my $line  = <STDIN>; 
    # .. use $connection to fetch data for user 
    }; 
}; 

for (my $i=0; $i<10; $i++) { 
    add_connection($i, &login); 
}; 

main->run(
    'host'  => '*', 
    'port'  => 7000, 
    'ipv'   => '*', 
    'max_server' => 3, 
}; 

不幸的是,程序在第一次登錄後死亡:「不能在../../lib/Storable.pm存儲代碼的項目」。即使將$連接隱藏在匿名數組中,也會發生這種情況。我正在尋找一種替代方式來利用泳池。

我感謝您的支持

回答

0

我不能提出替代模塊,但要這可能會或不會使用的建議。雖然不能存儲CODE,但可以存儲可評估運行的字符串。是否可以傳遞對字符串q!&login!的引用,您可以在分配給$ connection後取消引用。 ?

#!/usr/bin/perl 
use warnings; 
use strict; 

use Storable; 

my $codestring = q'sub { q^japh^ };' ; 

#my $codestring = q'sub { return MyConnectClass->new(); }'; 
# 
# for (0..9){ add_connection($i, $codestring) } 

open my $file, '>', '.\filestore.dat' or die $!; 

store \ $codestring, $file; 

close $file; 

open $file, '<', '.\filestore.dat' or die " 2 $!"; 

my $stringref = retrieve $file; # my $con = get_connection() 

close $file; 

print &{ eval $$stringref } ;  # &{eval $$con} ; 
exit 0;       # my $line = <STDIN>; ... 
+0

*可能是一個完全不理解的領帶。 – doncoyote