我的Perl應用程序使用的資源有時暫時不可用,導致使用die
的異常。最值得注意的是,它訪問由多個線程共享的SQLite數據庫以及其他使用DBIx::Class
的應用程序。每當發生這種異常時,應該重試該操作直到達到超時。在發生異常後重試操作:請批評我的代碼
我喜歡簡潔的代碼,所以我很快就厭倦了反覆 鍵入7條額外的線路爲每個這樣的操作:
use Time::HiRes 'sleep';
use Carp;
# [...]
for (0..150) {
sleep 0.1 if $_;
eval {
# database access
};
next if [email protected] =~ /database is locked/;
}
croak [email protected] if [email protected];
...所以我把它們放在一個(DB特定接入)功能:
sub _retry {
my ($timeout, $func) = @_;
for (0..$timeout*10) {
sleep 0.1 if $_;
eval { $func->(); };
next if [email protected] =~ /database is locked/;
}
croak [email protected] if [email protected];
}
我稱之爲是這樣的:
my @thingies;
_retry 15, sub {
$schema->txn_do(
sub {
@thingies = $thingie_rs->search(
{ state => 0, job_id => $job->job_id },
{ rows => $self->{batchsize} });
if (@thingies) {
for my $thingie (@thingies) {
$thingie->update({ state => 1 });
}
}
});
};
有AB etter的方式來實現這一點?我正在重新發明輪子嗎?我應該使用CPAN上的代碼 ?
在這種情況下,Lambdas是改善代碼重用的好方法。儘管有時他們可以降低可讀性,但在這種情況下,他們實際上可以提高很多。 – 2009-07-03 06:30:28
澄清:我在說,你已經在做什麼(== lambda)是好的。 – 2009-07-03 06:31:05