2011-06-26 69 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"; 
    } 

} 

我不確定是否這是最好的方式去做這件事。它似乎在我的非常簡單的測試用例中工作正常,但我不確定是否劫持對象的BUILD方法或以這種方式本地化信號處理程序是正確的,甚至是可取的。

回答

2

這裏小心點。 本地$ SIG {ALRM}僅適用於BUILD方法,所以如果您在不調用報警0的情況下離開函數的作用域,那麼如果您離開了BUILD方法並且超時發生。在eval內完成整個事情是最安全的,所以你不會遇到晦澀難懂的問題。

+0

這實際上就是我的意圖 - 基本上這些類是執行某個來自隊列的作業的類,每個進程都有一個作業。我想以這樣的方式設置超時:如果作業需要一分多鐘,則進程停止並記錄錯誤。 – friedo

+0

那麼你沒有什麼可擔心的。你發佈的內容對我來說看起來不錯。 –