我有以下代码对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();
答案 0 :(得分: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
答案 1 :(得分:0)
当你在while循环中调用$ cv-&gt; recv()并且脚本正在等待$ cv-&gt; send或$ cv-&gt; croak时阻止脚本执行,但在回调中你不能调用$ CV-&gt;置于()。
$ cv-&gt; recv
等待(必要时阻止),直到在$ cv上调用 - &gt; send或 - &gt; 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();