AnyEvent эквивалент Event Var Watcher? - PullRequest
0 голосов
/ 12 августа 2011

Я использую Event var watcher для реализации внутренней очереди. Когда поток производителя добавляет что-то в очередь (просто массив), он изменит значение отслеживаемой переменной, чтобы указать, что элемент был добавлен.

Как вы можете сделать то же самое с AnyEvent? Кажется, он не поддерживает наблюдение за переменными. Должен ли я использовать каналы и использовать наблюдатель ввода-вывода (т.е. производитель записывает байт на один конец канала, когда он добавил элемент.)

Мне также было бы интересно узнать, как это сделать с Coro.

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Я понял, какую парадигму использовать:

my @queue;
my $queue_watcher;

sub add_item {
   push(@queue, $_[0]);
   $queue_watcher ||= AnyEvent->timer(after => 0, cb => \&process_queue);
}

sub process_queue {
  ... # remove zero or more elements from @queue
  if (@queue) {
    $queue_watcher = AnyEvent->timer(after => 0, cb => \&process_queue);
  } else {
    undef $queue_watcher;
  }
}

В основном $queue_watcher определяется и активен тогда и только тогда, когда @queue не является пустым.

0 голосов
/ 13 августа 2011

Звучит так, как будто вы используете переменное наблюдение как средство передачи контроля обратно потребителю.В AnyEvent это можно сделать с помощью условных переменных, вызвав $ cv-> send () от производителя и $ cv-> recv () у потребителя.Вы могли бы рассмотреть отправку () элемента, который вы в противном случае поместили бы в очередь, но вызов отправки без параметров должен быть разрешенным способом уведомления потребителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...