2016-05-30 8 views
4

У меня есть код ниже, чтобы сделать не блокирующий rpush на сервере redis Когда я запускаю это всего за 1 rpush, код отлично работает Но когда я запускаю это в цикле while, скрипт зависает после первого выполнения. Почему?Perl Anyevent, не блокирующий redis push

#!/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(); 

ответ

0

Вы блокируете выполнение сценария, когда вы вызываете $ cv-> recv(), в то время как цикл и скрипт ждут $ cv-> send или $ cv-> croak, но в обратном вызове вы не вызываете $ cv-> send().

$ CV-> RECV

Wait (блокировка при необходимости), пока -> отправить или -> карканье методы были вызваны на $ сорта, при обслуживании других наблюдателей обычно.

Если вы хотите отправить разные запросы не блокирования, попробуйте использовать методы запуска и завершения 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(); 
+0

Это сработало благодаря – Ram

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