2011-06-26 19 views
4

私は、ネットワーク上でさまざまな操作を行うクラスをたくさん持っています。わかっているように、ネットワーク操作がタイムアウトすることがあります。だから私はこのようなことを考えている:ロールにアラームを設定する

package My::Role::NetworkFetcher { 
    use Moose::Role; 

    sub BUILD { 
     my $self = shift; 
     local $SIG{ALRM} = sub { 
      $self->handle_timeout; 
     }; 

     alarm 60; 
    } 

    sub handle_timeout { 
     die "default timeout handler"; 
    } 

} 

私はこれについてこれを行う最善の方法は分かりません。 は、私の非常に簡単なテストケースではOKで動作するようにはと思われますが、オブジェクトのBUILDメソッドをハイジャックしたり、シグナルハンドラをこのようにローカライズすることが正しいかどうかはわかりません。

答えて

2

ここで注意してください。 ローカル$ SIG {ALRM}はBUILDメソッドにのみ適用されます。したがって、アラーム0を呼び出さずに関数のスコープを終了すると、BUILDメソッドを終了するとデフォルトのALRMハンドラが実行されます。タイムアウトが発生します。あなたがあいまいな問題にぶつからないように、評価の中で全体を行うのが最も安全です。

+0

これは実際には私の意図です。基本的には、プロセスごとにキューから入ってくる特定のジョブを実行するクラスです。タイムアウトを設定して、ジョブが1分以上かかると、プロセスが終了してエラーが記録されるようにします。 – friedo

+0

それで、心配することは何もありません。あなたが投稿したものは私には良く見えます。 –

関連する問題