Держите Perl-скрипт в рабочем состоянии

У меня есть perl-скрипт, который подписывается на очередь сообщений с помощью AnyEvent::MQTT.

В данный момент все, что я хочу, это распечатать, когда он получит сообщение. Я новичок в Perl, поэтому я использую демонстрационный код, который включает в себя бит, который публикует что-либо в STDIN в виде сообщения - это прекрасно работает, и я могу видеть все полученные сообщения.

Этот код выглядит следующим образом

#!/usr/bin/perl
use strict;
use warnings;

use AnyEvent::MQTT;
my $mqtt = AnyEvent::MQTT->new;
my $cv = $mqtt->subscribe(topic => '/AlarmMode',
                           callback => sub {
                               my ($topic, $message) = @_;
                                       print $topic, ' ', $message, "\n"
                                   });

my $qos = $cv->recv; # subscribed, negotiated QoS == $qos



  # publish line-by-line from file handle
      $cv =  $mqtt->publish(handle => \*STDIN,
                            topic => '/topic');

У меня проблема в том, что если я удалю все после комментария publish line-by-line from file handle, мое приложение выйдет, как только оно запустится.

Я попытался включить цикл while, который спит в течение 5 секунд, но это не работает (приложение выглядит так, как будто оно зависло).

Я знаю, что мне нужно сделать что-то, чтобы сказать приложению просто остаться в живых и расслабиться, но я не знаю, что это за команда :-)


person Ross Dargan    schedule 17.01.2016    source источник


Ответы (1)


Если вы заблокируете что-то, что не поддерживает AE (например, sleep), то события AE не будут обрабатываться.

Чтобы заснуть, позволяя обрабатывать события AE, обычно используется

my $done_cv = AE::cv;
$done_cv->recv;

Используйте $done_cv->send;, чтобы выйти из сна. Например, если вы хотите поспать 5 секунд, вы должны использовать

my $sleep_cv = AE::cv;
my $w = AE::timer(5, 0, $sleep_cv);  # Short for AE::timer(5, 0, sub { $sleep_cv->send });
$sleep_cv->recv;
person ikegami    schedule 17.01.2016
comment
Моя последняя строка будет my $qos = $cv->recv; # subscribed, negotiated QoS == $qos. Не будет ли это ждать тогда? - person Ross Dargan; 17.01.2016
comment
Оно ждет. Он ожидает завершения подписки, потому что именно тогда для этого резюме вызывается send. Но вы хотите продолжать ждать дальше этого. [Переименовал переменные в моем ответе, чтобы избежать путаницы.] - person ikegami; 17.01.2016