Perl Anyevent,非阻塞redis推

时间:2016-05-30 13:32:46

标签: perl event-handling anyevent

我有以下代码对redis服务器进行非阻塞rpush 当我只运行1次rpush时,代码工作正常 但是当我在while循环中运行它时,脚本在第一次执行后挂起。 为什么?

#!/usr/bin/perl                                                                                                                                                          
use AnyEvent;
use AnyEvent::Redis::RipeRedis;
use strict;
#my $cv = AE::cv();                                                                                                                                                      

my $redis = AnyEvent::Redis::RipeRedis->new(
  host     => 'localhost',
  port     => '6379',
    );

my $i=0;

my $cv;
while($i++ < 5) {
    $cv = AnyEvent->condvar;
    $redis->rpush( 'list', "1","2","3",
                   { on_done => sub {
                   my $data = shift;
                   print "$data\n";
                     },
                   }
        );
    $cv->recv();
}
$redis->quit(
    sub {$cv->send();}
    );
$cv->recv();

2 个答案:

答案 0 :(得分:0)

请注意,您尚未定义connection_timeout:

my $redis = AnyEvent::Redis::RipeRedis->new(
  host     => 'localhost',
  port     => '6379',
    );

看起来应该是:

  my $redis = AnyEvent::Redis::RipeRedis->new(
    host => 'localhost',
    port => '6379',
    password => 'your_password',
    connection_timeout => 5,
    reconnect => 1,
    encoding => 'utf8');

自:

ftp://ftp.uni-siegen.de/pub/CPAN/authors/id/I/IP/IPH/AnyEvent-Redis-RipeRedis-1.002.readme

答案 1 :(得分:0)

当你在while循环中调用$ cv-&gt; recv()并且脚本正在等待$ cv-&gt; send或$ cv-&gt; croak时阻止脚本执行,但在回调中你不能调用$ CV-&gt;置于()。

  

$ cv-&gt; recv

     

等待(必要时阻止),直到在$ cv上调用 - &gt; send或 - &gt; croak方法,同时正常为其他观察者提供服务。

如果要发送不同的非阻塞请求,请尝试使用AnyEvents开始和结束方法。

#!/usr/bin/perl
use AnyEvent;
use AnyEvent::Redis::RipeRedis;
use strict;

my $redis = AnyEvent::Redis::RipeRedis->new(
  host     => 'localhost',
  port     => '6379',
);

my $i=0;

my  $cv = AnyEvent->condvar;
while($i++ < 5) {
   $cv->begin;
   $redis->rpush( 'list', "1","2","3",
               { 
                  on_done => sub {
                    my $data = shift;
                    print "$data\n";
                    $cv->end();
                  },
               }
    );
}

$cv->recv();