Я специально использую AnyEvent::Inotify::Simple (используя EV в качестве бэкенда) для мониторинга событий файла. Итак, у меня есть обратный вызов обработчика, который в конкретном случае мне нужно «приостановить», прежде чем продолжить. sleep
очевидно останавливает все (поэтому другие события не обрабатываются до тех пор, пока не будет выполнено sleep
), поэтому я попытался использовать alarm
, однако, если возникает тот же сценарий, который снова устанавливает сигнал тревоги, исходный сигнал тревоги (и, следовательно, его $SIG{ALRM}
sub) игнорируется и запускается только "новый".
#sleep-based approach (definitely a no-go)
sub handler {
my ( $self, $event, $file ) = @_;
#do some stuff
...
if( $some_condition_exists ) {
sleep(3);
#now that we've waited, if some change occurred then do stuff
if ( $new_change_occurred ) {
#do some new stuff
}
}
return;
}
#alarm -based approach (still a no-go when callback is called again while original alarm is still counting down)
sub handler {
my ( $self, $event, $file ) = @_;
#do some stuff
...
if( $some_condition_exists ) {
$SIG{ALRM} = sub {
#now that we've waited, if some change occurred then do stuff
if ( $new_change_occurred ) {
#do some new stuff
}
}
alarm(3);
}
return;
}
Любой совет будет принят во внимание? Все, что мне нужно, — это способ приостановить обратный вызов, продолжая асинхронно обрабатывать новые события inotify.
$cv->recv
, чтобы заснуть, и сделайте$cv->send
, когда произойдет изменение. - person ikegami   schedule 15.01.2015AE::timer(3, $cv);
для предоставления тайм-аута. - person ikegami   schedule 15.01.2015recv
, очередь событий будет проверена на наличие события таймера, поэтому его можно использовать для тайм-аута. - person ikegami   schedule 19.02.2015