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!&amp;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 连接的主要内容,如果未能解决你的问题,请参考以下文章

检查 IPC 共享锁

Perl IPC 不使用共享内存?

IPC::Shareable 变量,“不能使用字符串...作为 SCALAR ref..”和内存地址

神经网络——最大池化层的使用

图像平均池化

自适应池化最大值池化和均值池化效率的比较分析