gpt4 book ai didi

perl - 使用 Redis 和 Perl,如何等待一个已发布的方法

转载 作者:IT王子 更新时间:2023-10-29 06:11:23 24 4
gpt4 key购买 nike

我想做一些概念上非常简单的事情,最多等待 30 秒让重做发布通过。一通过就想返回,没有通过就三十秒后再返回。

perl Redis模块几乎有我想要的一切,除了我收到消息后不能立即返回。

我使用的示例代码如下所示:

#!/usr/bin/perl

use Redis;

my $redisSub = Redis->new;
my $msg = 0;
my @topics = ('mykey');
my $savecallback = sub {
my ($message, $topic, $subscribed_topic) = @_;
print "Message received : $message\n";
$msg = $message;
# I tried adding in the following line, but it complains
# that: Missing required callback in call to unsubscribe()
#$redisSub->unsubscribe ( @topics , $savecallback);
};
$redisSub->subscribe ( @topics , $savecallback);

my $redis = Redis->new;
print "old: " . $redis->get('mykey') . "\n";
print "Waiting for message to be sent\n";
$redisSub->wait_for_messages(30);

if ($msg) {
print "old: " . $redis->get('mykey') . "\n";
} else {
print "Timeout occurred\n";
}

问题是 wait_for_messages(30) 调用会等待 30 秒的空闲事件,因此如果消息出现,它会立即打印出“收到消息”,但随后会等待另一个消息在将控制权返回给脚本之前三十秒。我可以将它更改为 wait_for_messages(0),但它会立即返回,我需要将其包含在 sleep 循环中,这会在检测调用之外的变化时引入潜在的延迟。

仅使用 Redis 模块是否可行?或者是否需要使用 AnyEvent::Redis::PipeRedis模块来做这个?

最佳答案

回答:没有您提到的延迟。要在消息到达时不再等待而停止,请使用 unsubscribe() 但我尚未对其进行测试。

如何:你必须这样做:

while ('true' ) {
$redisSub->wait_for_messages(30);
}

原因:上面等待消息 30 秒,然后再等待 30 秒,依此类推。但是,只要订阅的事件发生,就会立即调用回调子例程,但 wait_for_messages 从原始状态继续(独立于调用/事件发生/事件未发生)。 如果订阅的消息即将到来,wait_for_messages(n) 将不会在 n 秒内返回。所以它会持续等待 30 秒。因此,如果匹配发布每 29 秒发生 10 次,则 wait_for_messages 将仅在 290+30 秒后返回,返回值为 10。(然后由于 while('true') 它将再次返回等待。)

Note :1) Do/should not add sleep in the above code.
Note :2) If your aim is to stop processing after receiving first
message, you have to use $redisSub->unsubscribe(..)
inside the call-back-subroutine.

关于perl - 使用 Redis 和 Perl,如何等待一个已发布的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com