2016-05-30 12 views
4

Ich habe den folgenden Code zu tun, nicht blockieren rpush in einem Redis-Server Wenn ich dies für nur 1 rpush, funktioniert der Code gut Aber wenn ich dies in einer Weile das Skript ausführen hängt nach der ersten Ausführung. Warum?Perl Anyevent, nicht blockierende 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(); 

Antwort

0

Sie blockieren die Skriptausführung, wenn Sie $ cv-> recv() in while-Schleife und Skript $ cv-> send oder $ cv-> croak aufrufen, aber im Callback rufen Sie nicht $ cv-> send() auf.

$ cv-> recv

Warten (Blockierung, wenn nötig), bis der -> senden oder -> quaken Methoden haben sich auf $ cv genannt worden, während andere Beobachter der Wartung normal.

Wenn Sie verschiedene nicht blockierende Requests senden möchten, versuchen Sie, AnyEvents Methoden zum Starten und Beenden zu verwenden.

#!/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

Das funktionierte dank – Ram