4

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();
4

2 に答える 2

1

while ループで $cv->recv() を呼び出し、スクリプトが $cv->send または $cv->croak を待機しているときにスクリプトの実行をブロックしますが、コールバックでは $cv->send() を呼び出しません。

$cv->recv

->send または ->croak メソッドが $cv で呼び出されるまで (必要に応じてブロックして) 待機し、他のウォッチャーに通常どおりサービスを提供します。

別の非ブロッキング リクエストを送信する場合は、AnyEvents の begin メソッドと end メソッドを使用してみてください。

#!/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();
于 2016-05-31T11:46:30.147 に答える
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

于 2016-05-30T13:59:33.860 に答える