Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > AnyEvent i/o watchers


Автор: nIkTo 22.6.2010, 13:58
Существует некоторая сетевая папка, она при монтирована как диск (к примеру S:\)
Необходимо обойти дерево каталогов этого диска ... так как папка сетевая, то соответственно возникает некоторая задержка при прочтении каталога (иногда доходит до 3-5 секунд).
А раз есть ожидания то мне кажется логичнее всего было бы использование события, вот пытаюсь понять как можно было бы  реализовать решение при помощи AnyEvent но разобраться сложно, не хватает информации =(
Вот есть такая штука как I/O WATCHERS :

Код

$w = AnyEvent->io (
      fh   => <filehandle_or_fileno>,
      poll => <"r" or "w">,
      cb   => <callback>,
   );


как бы это сделать но для dh (dirhandle) ? то есть, как появились данные в dirhandle вызвать колбэк ?

Автор: DurRandir 23.6.2010, 10:27
Помотрите в сторону IO::AIO, у него есть интеграция с AnyEvent

Автор: nIkTo 23.6.2010, 10:58
Смотрел, но по моему это не то :

Код

#!/usr/bin/perl -w
use strict;
use IO::AIO;

my $root = "s:\\";
scan($root);

sub scan {
  my $path = shift;
  
  aio_readdir $path, sub {
    my $objects = shift;
    my @dirs = ();
    
    foreach my $object (@$objects) {
      print $path."/".$object."\n";
      if (-d $path."/".$object) {
        push @dirs, $path."/".$object;
      }
    }
    
    &scan($_) for @dirs;
  };
}

Автор: DurRandir 24.6.2010, 10:51
Ну тогда я не понял вопроса) Этот код как раз и прочитает в фоне всё дерево, можно даже от -d  избавиться, запросив aio_readdirx + IO::AIO::READDIR_DENTS

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)