【问题标题】:Perl Anyevent , non blocking redis pushPerl Anyevent ,非阻塞 redis 推送
【发布时间】:2016-05-30 13:32:46
【问题描述】:

我有下面的代码来做非阻塞 rpush 到一个 redis 服务器 当我只运行 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();

【问题讨论】:

    标签: perl event-handling anyevent


    【解决方案1】:

    当您在 while 循环中调用 $cv->recv() 并且脚本正在等待 $cv->send 或 $cv->croak 时,您会阻止脚本执行,但在回调中您不调用 $cv->send( )。

    $cv->recv

    等待(必要时阻塞),直到 $cv 上调用了 ->send 或 ->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();
    

    【讨论】:

      【解决方案2】:

      请注意你还没有定义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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多