[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