[Rio-pm] AnyEvent

Stanislaw Pusep creaktive em gmail.com
Quinta Março 15 06:32:46 PDT 2012


Aureliano, não basta mudar um pouco, precisa renovar os seus conceitos a
respeito da paralelização :)
Veja bem: todo o propósito do AnyEvent é *evitar* o uso do fork(); sendo
que o fork_call do AnyEvent::Util é um "last resort".
Em primeiro lugar: por que uma conexão demora? Resposta: o seu programa
fica no estado "blocked" até que todo o stack TCP/IP chegue num estado
consistente (isso é, retorne um dado ou erro). O que o AnyEvent faz com I/O
no geral e os sockets TCP/IP em específico é: "fire-and-forget".
Você fala:
"quero conexão TCP para IP:porta; quando conseguir, rode esse código;
prossiga JÁ"
Ao invés de:
"quero conexão TCP para IP:porta; quando conseguir, prossiga"
Compreende a diferença?

ABS()



On Wed, Mar 14, 2012 at 19:09, Aureliano Guedes <guedes_1000 em hotmail.com>wrote:

>  Moço, você revela meu codinome assim na frente da comunidade toda...
> hahaha
>
> Não entendi, o sleep não faz nada, ja tirei, não entendi essa história de
> incrementar a variavel no while.
> Após conectar no socket eu enviaria o que??
>
> Mudei um pouco, o que ainda falta??
>
>
> #!/usr/bin/perl -w
>
> use common::sense;
> use IO::Socket::INET;
> use AnyEvent::Util;
> use List::Util qw(shuffle);
>
> sub usage {
>    printf "Usage: %s <hostaddr> <port> <packs> <request>\n", $0;
>    printf "   <hostaddr> - Adress to check.\n";
>    printf "   <port>     - Port to check 1-1024(default is 80).\n";
>    printf "   <request>  - Number of requests(default is 10).\n";
>    exit;
> }
>
> my $host = $ARGV[0] || usage;
> my $port = $ARGV[1] || 80;
> my $request = $ARGV[2] || 10;
>
> my $cv = AE::cv;
>
>     $AnyEvent::Util::MAX_FORKS = 10;
>
> for (1 .. $request){
>
>     $cv->begin;
>         fork_call {
>
>
>         } sub {
>             &connect($port, $host);
>             $cv->end;
>         };
>
>
> }
>
> $cv->wait;
>
>
> sub connect{
>     my $pr = shift;
>     my $ht = shift;
>     my $ping = IO::Socket::INET->new(
>         PeerPort => $pr ,
>         PeerAddr => $ht,
>         Proto => 'udp',
>         LocalAddr => 'localhost',
>         Broadcast => 1,
>         Type => SOCK_DGRAM
>
>     )
>     or die "Can't bind : $@\n";
> }
>
> ------------------------------
> From: juniiior182 em gmail.com
> Date: Wed, 14 Mar 2012 18:10:22 -0300
>
> To: rio-pm em pm.org
> Subject: Re: [Rio-pm] AnyEvent
>
> Hi.
>
> Xuxu's, primeiro vamos por partes.
>
> Pra começar, você não tá incrementando a variável no while(). Daria um
> loop infinito.
> Segundo... Qual a função do sleep ali?
> Terceiro... Se ainda sim executasse a ação solicitada, só conectaria no
> socket e então não faria mais nada. LOL
>
> []'s
>
> Em 14 de março de 2012 18:02, Aureliano Guedes <guedes_1000 em hotmail.com>escreveu:
>
>  Valeu mesmo a ajuda, o bom de ser um "Perlzeiro" é que alem da linguagem
> maravilhosa tem uma comunidade muito
> atenta para ajudar.
>
> Poderia dar uma analizada no meu codigo.
>
>
> #!/usr/bin/perl -w
>
>
> use common::sense;
> use IO::Socket::INET;
> use AnyEvent::Util;
> use List::Util qw(shuffle);
>
>
> sub usage {
>    printf "Usage: %s <hostaddr> <port> <packs> <request>\n", $0;
>    printf "   <hostaddr> - Adress to check.\n";
>    printf "   <port>     - Port to check 1-1024(default is 80).\n";
>    printf "   <packs>    - Number of packages(default is 65000).\n";
>    printf "   <request>  - Number of requests(default is 10).\n";
>    exit;
> }
>
> my $host = $ARGV[0] || usage;
> my $port = $ARGV[1] || 80;
> my $request = $ARGV[2] || 10;
> my $a = 1;
>
> my $cv = AE::cv;
>
>     $AnyEvent::Util::MAX_FORKS = 10;
>
> while ($a <= $request){
>
>     $cv->begin;
>         fork_call {
>             sleep $a;
>         } sub {
>             &connect($port, $host);
>             $cv->end;
>         };
>
>
> }
>
> sub connect{
>     my $pr = shift;
>     my $ht = shift;
>     my $ping = IO::Socket::INET->new(
>         PeerPort => $pr ,
>         PeerAddr => $ht,
>         Proto => 'udp',
>         LocalAddr => 'localhost',
>         Broadcast => 1 )
>     or die "Can't bind : $@\n";
> }
>
> ------------------------------
> From: creaktive em gmail.com
> Date: Wed, 14 Mar 2012 17:48:24 -0300
> To: rio-pm em pm.org
> Subject: Re: [Rio-pm] AnyEvent
>
>
> Você está fazendo isso certo :)
> Um exemplo ilustrativo tosco de como usar AnyEvent para o que vc quer
> (observe a lógica; o protocolo aqui é HTTP em cima de TCP):
>
>
>
>
>
>
>         my $cv = AE::cv;
>
>
>
>
>
>
>
>
>
>         my $i = 0;
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>         my $get;
>
>
>
>
>
>
>
>
>
>         $get = sub {
>
>
>
>
>
>
>
>
>
>             $cv->begin;
>
>
>
>
>
>
>
>
>
>             http_get $urls[$i++], sub {
>
>
>
>
>
>
>
>
>
>                 $get->() if $i <= $#urls;
>
>
>
>
>
>
>
>
>
>                 $cv->end;
>
>
>
>
>
>
>
>
>
>             };
>
>
>
>
>
>
>
>
>
>         };
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>         for (1 .. $parallel) {
>
>
>
>
>
>
>
>
>
>             $get->();
>
>
>
>
>
>
>
>
>
>         }
>
>
>
>
>
>
>
>
>
>         $cv->wait;
>
>
>
>
>
> Mais detalhes sobre AnyEvent:
>
> http://sao-paulo.pm.org/equinocio/2011/set/13
>
> ABS()
>
>
>
> On Wed, Mar 14, 2012 at 17:29, Aureliano Guedes <guedes_1000 em hotmail.com>wrote:
>
>  Boa tarde monges,
> estou tentando entender o modulo AnyEvent, mas programação orientada a
> eventos é  russo pra minha cabeça ainda.
>
> Eu tenho uma rotina que se conecta a um IP qualquer usando protocolo UDP
> com IO::Socket::INET, e quero que essa rotina tente fazer 10 requisições
> por vez.
> Eu ja eliminei a ideia de usar threads, mas to com dificuldade de usar
> esse modulo.
>
> To totalmente perdido, pensei em usar AnyEvent::Util e List::Util, mas to
> começando a achar que não é apropriado, mas foi la que achei um exemplo
> mais ou menos...
>
> Se puderem colaborar com um exemplo bem simples para eu entender, eu
> agradeço...
>
> Att,
> Aureliano Guedes
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
> _______________________________________________ Rio-pm mailing list
> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
>
>
> --
> Junior Moraes (fvox)
> Perl Developer
> http://www.unsecurity.com.br/
>
> <http://www.twitter.com/juniiormoraes> <http://pt-br.facebook.com/juniiormoraes>
>   <http://plus.google.com/104958988925423385684> <http://www.lastfm.com.br/user/juniior182>
>   <http://www.delicious.com/fvox>  <http://github.com/fvox>
>
>
> _______________________________________________ Rio-pm mailing list
> Rio-pm em pm.org http://mail.pm.org/mailman/listinfo/rio-pm
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20120315/17e8f0d3/attachment-0001.html>


Mais detalhes sobre a lista de discussão Rio-pm