Perl Anyevent, не блокирующий Redis Push
У меня есть код ниже, чтобы сделать не блокирующую 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();
2 ответа
Вы блокируете выполнение скрипта, когда вызываете $cv->recv() в цикле while, а скрипт ожидает $ cv-> send или $ cv-> croak, но при обратном вызове вы не вызываете $ cv-> send ().
$ CV-> RECV
Подождите (при необходимости блокируя), пока на $ cv не будут вызваны методы -> send или -> croak, при этом обычно обслуживая других наблюдателей.
Если вы хотите отправлять разные неблокирующие запросы, попробуйте использовать 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();
Обратите внимание, что вы не определили, 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