私は特に AnyEvent::Inotify::Simple (バックエンドとして EV を使用) を使用してファイル イベントを監視しています。したがって、特定のケースでは、続行する前に「一時停止」する必要があるハンドラー コールバックがあります。 sleep
明らかにすべてを停止します(そのため、他のイベントは処理が完了するまで処理されませんsleep
)ので、使用してみalarm
ましたが、アラームを再度設定する同じシナリオが発生した場合、元のアラーム(したがってその$SIG{ALRM}
サブ)は無視され、「新しい" 1 つが実行されます。
#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 イベントを非同期で処理し続けながら、コールバックを一時停止する方法だけです。