in reply to AnyEvent::DNS is effectively synchronous?
in thread Async DNS with LWP

You get ten times the "one domain", because you print $domain 10 times. What value would you $domain to have at which time?

Looking at the documentation of AnyEvent::DNS, the SYNOPSIS section shows how to retrieve results from a query. I'm not sure what problems you have with that.

If you want to do a callback-driven approach, take a look at the AnyEvent::DNS::srv subroutine. Again, the usage seems quite straightforward, as the resolved IPs get passed as parameters.

Replies are listed 'Best First'.
Re^2: AnyEvent::DNS is effectively synchronous?
by jc (Acolyte) on Oct 05, 2010 at 12:51 UTC
    Thanks, in the meantime I'd realised that myself. Just in case it's useful to anybody else I include my code so far for asynchronous resolution. As far as I can see from the documentation retrieving records from the results should be as simple as traversing an array of arrays and picking out the bits you want. e.g. A or AAAA records.
    #!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; use AnyEvent::DNS; my ($domain,$START_TIME,$MAX_QUERIES,$MAX_QUEUE, $time,$done,$resolved); my (@domains,@condvars); $START_TIME = time; $MAX_QUERIES = 1000; $MAX_QUEUE = 10; $resolved = 0; # setup resolver my $resolver = AnyEvent::DNS::resolver; $resolver->max_outstanding($MAX_QUEUE); #$resolver->timeout([0,1,2]); while (1) { # send dns packets for my $i (1..$MAX_QUERIES) { $domain = <>; # clean off newline chomp $domain; $resolver->resolve($domain,"*",my $condvar = AnyEvent->condvar); push @condvars, $condvar; } # receive dns packets while (my $condvar = pop @condvars) { $resolved++ if ($condvar->recv); #warn Dumper [$condvar->recv]; } $done += $MAX_QUERIES; $time = time - $START_TIME; print "Done $done domains, $resolved resolved in $time seconds.\n"; }
AnyEvent::HTTP usage
by jc (Acolyte) on Oct 05, 2010 at 14:05 UTC
    Following is the most simple usage example from the AnyEvent::HTTP documentation. For me this program finishes without any output. Does anybody have any ideas why this doesn't work?
    #!/usr/bin/perl -w use strict; use warnings; use AnyEvent::HTTP; http_get "http://www.google.com/", sub { print $_[1] };

      I guess you need to enter an AnyEvent "main loop" and wait for all asynchronous things to finish. See the AnyEvent documentation:

      use AnyEvent; use AnyEvent::HTTP; my $done = AnyEvent->condvar; # stores whether a condition was flagged http_get "http://www.google.com/", sub { print $_[1]; $done->send }; $done->recv; # enters "main loop" till $condvar gets ->send

      Even better, you could send yourself the data through the condvar.

        Thanks, OK. So here's what I've got so far. I've got this thing doing asynchronous HEADs. I'm allowing 10 HEAD requests to be fired off at a time. But, here's the but... it doesn't really seem to be working any faster than an LWP based version forked into 10 processes. Perhaps, you were right Corion. Maybe this is not the kind of optimisation my crawler needs. Any other ideas?
        #!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; use AnyEvent::HTTP; my ($domain,$START_TIME,$MAX_QUERIES,$MAX_QUEUE,$time,$done,$heads); my (@condvars); $START_TIME = time; $MAX_QUERIES = 10; $MAX_QUEUE = 10; $heads = 0; while (1) { # send dns packets for my $i (1..$MAX_QUERIES) { $domain = <>; # clean off newline chomp $domain; my $http_url = "http://www.".$domain; my $condvar = AnyEvent->condvar; push @condvars, $condvar; http_request HEAD => $http_url, sub { #warn Dumper @_; $condvar->send; }; } while (my $condvar = pop @condvars) { $condvar->recv; } $done += $MAX_QUERIES; $time = time - $START_TIME; print "Tried $done domains, $heads headers found in $time seconds.\n +"; }