Perl:使用 IPC::Shareable 池化 Net::Server 连接
Posted
技术标签:
【中文标题】Perl:使用 IPC::Shareable 池化 Net::Server 连接【英文标题】:Perl: Using IPC::Shareable for pooling Net::Server connections 【发布时间】:2014-03-03 17:37:57 【问题描述】:我正在尝试拥有一个可由 Net::Server 实例访问的共享连接池。不幸的是 IPC::Shareable 不允许我存储连接,因为它们是代码引用。这是代码的精简版:
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 存储 CODE 项目”。即使在匿名数组中隐藏 $connection 也会发生这种情况。我正在寻找利用游泳池的替代方案。
感谢您的支持
【问题讨论】:
【参考方案1】:我无法提出替代模块,但提出可能有用或无用的建议。虽然您不能存储 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>; ...
【讨论】:
*可能完全无法理解领带。以上是关于Perl:使用 IPC::Shareable 池化 Net::Server 连接的主要内容,如果未能解决你的问题,请参考以下文章