This may work (I haven't tested it):
use Time::HiRes qw( ualarm tv_interval gettimeofday );
my $ua = LWP::UserAgent->new;
my $fastest = undef;
MIRROR:
foreach my $mirror ( @mirrors ) {
my $url = "$mirror/file.tar.bz2";
my $request = HTTP::Request->new(HEAD => $url);
# if we have a possible fastest mirror, set an alarm
ualarm( $fastest->{response_time} * 1_000_000 )
if defined $fastest;
# attempt to fetch from this mirror in less time
# than the fastest so far
my ( $start_time, $response );
eval {
local $SIG{ALRM} = sub { die 'alarm' };
$start_time = [gettimeofday];
$response = $ua->request($request);
ualarm( 0 );
};
# if the alarm went off (or some other error),
# try next mirror
next MIRROR if $@;
my $response_time = tv_interval( $start_time );
my $status = $response->status_line;
# if this was successful,
if ( $status == 200 ) {
# if we haven't found a fast mirror yet,
# or this one's faster,
if ( ! defined $fastest
|| $fastest->{response_time} > $response_time ) {
# store this one as the fastest
$fastest = { mirror => $mirror,
response_time => $response_time };
}
}
}
What's nice about this:
- No forking.
- If I've found a live site, I never wait for a dead one. In fact, I never wait for a site slower than the fastest one I've seen.
- The $fastest that I find is a hash ref, so I can stash more info (such as the actual response) in there later, if I want.
I don't know how netselect works, so I can't speak to how well this works by comparison. I just hope to give you a good starting point.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|