• Publicidad

Código de respuesta

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Código de respuesta

Notapor explorer » 2011-03-05 13:31 @605

He construido un simulador de cómo se podría hacer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. ## Creación del entorno
  6. my @URL;
  7. for (1 .. 30) {
  8.     push @URL, "http://sitio.com/archivo$_.txt";
  9. }
  10.  
  11. my @PROXY;
  12. for (1 .. 10) {
  13.     push @PROXY, "proxy:$_";
  14. }
  15.  
  16. ## Simulación
  17. my $i_proxy = 0;                        # Primer proxy a usar
  18.  
  19. while (@URL) {                                  # Mientras tengamos URL que bajar
  20.     while (my($i, $url) = each @URL) {          # Por cada URL
  21.  
  22.         next if not $url;                       # Saltamos los vacíos
  23.  
  24.         for my $intentos ( 1 .. @PROXY ) {      # Lo intentamos tantas veces como proxies
  25.  
  26.             my $respuesta = pide($url, $PROXY[$i_proxy]);       # Solicitud
  27.  
  28.             $i_proxy = ++$i_proxy % @PROXY;     # Pasamos al siguiente proxy, siempre
  29.  
  30.             if ($respuesta == 200) {            # Conseguido
  31.                 delete $URL[$i];                # quitamos la URL
  32.                 last;                           # y probamos con la siguiente
  33.             }
  34.         }
  35.        
  36. #        die "ERROR: no ha bajado $url con todos los proxies";
  37.     }
  38. }
  39.  
  40. # simula una petición
  41. sub pide {
  42.     my($url, $proxy) = @_;
  43.  
  44. #    sleep 1;
  45.  
  46.     my $respuesta = ( 6 > rand 10 ) ? 200 : 500;        # simulamos respuesta
  47.  
  48.     say "$url respuesta:$respuesta $proxy";
  49.    
  50.     return $respuesta;
  51. }
  52.  
  53. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Se recorren las URL, y por cada una se prueba con todos los proxies, cada vez uno distinto. Y se repite hasta que ya no quedan más URL que probar.
Última edición por explorer el 2011-03-08 15:58 @707, editado 7 veces en total
Razón: Código más corto y die(). Ajuste del parámetro de éxito
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Código de respuesta

Notapor colorado » 2011-03-07 15:57 @706

Perdón por no haber contestado antes. El fin de semana me impidió jugar con el simulador que creaste, explorer.

Muchas gracias por molestarte en crearlo. Tiene buena pinta y creo que realiza lo que necesito.

Tengo un problema.

Por lo que veo, para ejecutarlo no necesito cambiar nada.

He instalado los módulos common::sense y autodie pero obtengo un error al intentar ejecutarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Type of arg 1 to each must be hash (not private array) at simulador.pl line 20, near "@
URL) "
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me gustaría verlo funcionar, pero el error me lo impide.

Voy a intentar adaptar todo a mi script, a ver cómo queda.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor explorer » 2011-03-07 16:28 @728

Ese each() solo funciona con Perl a partir de la versión 5.12, así que si te sale un error, es que tienes un Perl viejo.

Te cuento lo que hace: cada vez que se ejecuta, extrae el índice de un elemento de un array y el elemento correspondiente del array.

Puedes sustituir el while() con un bucle for() que recorra los índices de los elementos del array. Y una línea más que obtiene el elemento correspondiente a ese índice:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $i ( 0 .. $#URL) {
  2.     my $url = $URL[$i];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Código de respuesta

Notapor colorado » 2011-03-07 17:07 @754

WOW :D el simulador funciona tal y como quiero.

Gran trabajo.

Ahora viene lo complicado para mi: adaptarlo al script.

Voy a meterle caña a ver cómo me queda.

No cierro el tema, ya que seguro me saldrán problemas al intentar montarlo.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor colorado » 2011-03-08 14:20 @639

Genial solución, explorer.
Funcionando a la perfección en mi script.

Muy agradecido, explorer.
También agradecer a pvaldes, el tiempo invertido en ayudarme.

Por mi parte, tema cerrado.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor explorer » 2011-03-08 15:47 @699

El siguiente paso es hacer las peticiones de forma simultánea, como lo permite la distribución ParallelUserAgent. Lo malo es que la documentación relativa al uso del proxy es prácticamente nula, pero se puede sacar en la sección Proxy attributes de LWP::UserAgent y leyendo el código de LWP::Parallel::UserAgent.

Quizás sea más simple usar Parallel::ForkManager. Viene con un ejemplo para bajar una lista de enlaces, de forma paralela.

O usar HTTP::Async, que parece aún más fácil.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Código de respuesta

Notapor colorado » 2011-03-09 15:21 @681

Sí, es una buena solución para agilizar el programa utilizar por ejemplo, Parallel::ForkManager.

Otra idea para agilizarlo, sería "desactivar" los proxies que han dado una respuesta diferente a 200, en su primera vuelta, y seguir filtrándolos en su segunda, tercera... hasta quedarme sin ninguno, en ese momento volver a activarlos todos.

Me explico:

Imaginemos que en su primera vuelta, se han obtenido tres respuestas 500.
Esta sería la primera vuelta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo1.txt respuesta:200 proxy:1
http://sitio.com/archivo2.txt respuesta:200 proxy:2
http://sitio.com/archivo3.txt respuesta:500 proxy:3
http://sitio.com/archivo3.txt respuesta:200 proxy:4
http://sitio.com/archivo4.txt respuesta:200 proxy:5
http://sitio.com/archivo5.txt respuesta:500 proxy:6
http://sitio.com/archivo5.txt respuesta:200 proxy:7
http://sitio.com/archivo6.txt respuesta:500 proxy:8
http://sitio.com/archivo6.txt respuesta:200 proxy:9
http://sitio.com/archivo7.txt respuesta:200 proxy:10
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La segunda vuelta (quitamos todos los que dieron 500)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo8.txt respuesta:200 proxy:1
http://sitio.com/archivo9.txt respuesta:200 proxy:2
http://sitio.com/archivo10.txt respuesta:500 proxy:4
http://sitio.com/archivo10.txt respuesta:200 proxy:5
http://sitio.com/archivo11.txt respuesta:200 proxy:7
http://sitio.com/archivo12.txt respuesta:500 proxy:9
http://sitio.com/archivo12.txt respuesta:200 proxy:10
http://sitio.com/archivo13.txt respuesta:500 proxy:1
http://sitio.com/archivo13.txt respuesta:200 proxy:2
http://sitio.com/archivo14.txt respuesta:200 proxy:4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Tercera vuelta (quitamos todos los que dieron 500)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo15.txt respuesta:200 proxy:2
http://sitio.com/archivo16.txt respuesta:200 proxy:5
http://sitio.com/archivo17.txt respuesta:500 proxy:7
http://sitio.com/archivo17.txt respuesta:200 proxy:10
http://sitio.com/archivo18.txt respuesta:200 proxy:2
http://sitio.com/archivo19.txt respuesta:500 proxy:5
http://sitio.com/archivo19.txt respuesta:200 proxy:7
http://sitio.com/archivo20.txt respuesta:500 proxy:10
http://sitio.com/archivo20.txt respuesta:200 proxy:2
http://sitio.com/archivo21.txt respuesta:200 proxy:5
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Cuarta vuelta (quitamos todos los que dieron 500)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo22.txt respuesta:200 proxy:2
http://sitio.com/archivo23.txt respuesta:200 proxy:2
http://sitio.com/archivo24.txt respuesta:500 proxy:2
http://sitio.com/archivo24.txt respuesta:200 proxy:2
http://sitio.com/archivo25.txt respuesta:200 proxy:2
http://sitio.com/archivo26.txt respuesta:500 proxy:2
http://sitio.com/archivo27.txt respuesta:200 proxy:2
http://sitio.com/archivo28.txt respuesta:500 proxy:2
http://sitio.com/archivo28.txt respuesta:200 proxy:2
http://sitio.com/archivo29.txt respuesta:200 proxy:2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Quinta vuelta (reactivar todos)

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo30.txt respuesta:200 proxy:1
http://sitio.com/archivo31.txt respuesta:200 proxy:2
http://sitio.com/archivo32.txt respuesta:500 proxy:3
http://sitio.com/archivo32.txt respuesta:200 proxy:4
http://sitio.com/archivo33.txt respuesta:200 proxy:5
http://sitio.com/archivo34.txt respuesta:500 proxy:6
http://sitio.com/archivo34.txt respuesta:200 proxy:7
http://sitio.com/archivo35.txt respuesta:500 proxy:8
http://sitio.com/archivo35.txt respuesta:200 proxy:9
http://sitio.com/archivo36.txt respuesta:200 proxy:10
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿Se te ocurre cómo poder realizarlo, explorer?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor explorer » 2011-03-09 16:51 @743

La solución no es sencilla, pero esta es una manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4.  
  5. ## Creación del entorno
  6. my @URL;
  7. for (1 .. 30) {
  8.     push @URL, "http://sitio.com/archivo$_.txt";
  9. }
  10.  
  11. my @PROXY;
  12. for (1 .. 10) {
  13.     push @PROXY, "proxy:$_";
  14. }
  15.  
  16. ## Simulación
  17. my @proxy;
  18. my $p;
  19.  
  20. while (@URL) {                                  # Mientras tengamos URL que bajar
  21.     while (my($i, $url) = each @URL) {          # Por cada URL
  22.         next if not $url;                       # Saltamos los URL vacíos
  23.  
  24.         if (not @proxy) {
  25.             say "Renovamos lista de proxies";
  26.             @proxy = @PROXY;                    # Recargamos la batería de proxies a usar
  27.             $p = 0;
  28.         }
  29.         else {                                  # Buscamos el siguiente proxy más prometedor
  30.             do {
  31.                 $p = ++$p % @proxy;             # Apuntamos al siguiente proxy...
  32.             } until ($proxy[$p]);               # ... hasta que encontramos uno
  33.         }
  34.  
  35.         for my $intentos ( 1 .. @proxy ) {      # Lo intentamos tantas veces como proxies
  36.  
  37.             printf "[%2d/%2d] ", $intentos, scalar @proxy;
  38.  
  39.             if (not $proxy[$p]) {
  40.                 $p = ++$p % @proxy;             # Apuntamos al siguiente proxy
  41.                 print "...\n";
  42.                 next;                           # y reintentamos
  43.             }
  44.  
  45.             my $respuesta = pide($url, $proxy[$p]);
  46.  
  47.             if ($respuesta == 200) {            # Conseguido
  48.                 delete $URL[$i];                # quitamos la URL
  49.                 last;                           # y probamos con la siguiente
  50.             }
  51.             else {                              # Hubo un fallo
  52.                 delete $proxy[$p];              # quitamos proxy defectuoso
  53.                 last if not @proxy;             # salimos si no nos quedan más
  54.                 $p = ++$p % @proxy;             # Pasamos al siguiente proxy
  55.             }
  56.         }
  57.  
  58. #        die "ERROR: no ha bajado $url con todos los proxies";
  59.     }
  60. }
  61.  
  62. # simula una petición
  63. sub pide {
  64.     my($url, $proxy) = @_;
  65.  
  66. #    sleep 1;
  67.  
  68.     my $respuesta = ( 6 > rand 10 ) ? 200 : 500;        # simulamos respuesta
  69.  
  70.     print "$url\t[$respuesta] $proxy\n";
  71.  
  72.     return $respuesta;
  73. }
  74.  
  75. __END__
  76. Renovamos lista de proxies
  77. [ 1/10] http://sitio.com/archivo1.txt   [200] proxy:1
  78. [ 1/10] http://sitio.com/archivo2.txt   [200] proxy:2
  79. [ 1/10] http://sitio.com/archivo3.txt   [500] proxy:3
  80. [ 2/10] http://sitio.com/archivo3.txt   [200] proxy:4
  81. [ 1/10] http://sitio.com/archivo4.txt   [500] proxy:5
  82. [ 2/10] http://sitio.com/archivo4.txt   [200] proxy:6
  83. [ 1/10] http://sitio.com/archivo5.txt   [200] proxy:7
  84. [ 1/10] http://sitio.com/archivo6.txt   [200] proxy:8
  85. [ 1/10] http://sitio.com/archivo7.txt   [200] proxy:9
  86. [ 1/10] http://sitio.com/archivo8.txt   [500] proxy:10
  87. [ 2/ 9] http://sitio.com/archivo8.txt   [200] proxy:2
  88. [ 1/ 9] http://sitio.com/archivo9.txt   [200] proxy:4
  89. [ 1/ 9] http://sitio.com/archivo10.txt  [200] proxy:6
  90. [ 1/ 9] http://sitio.com/archivo11.txt  [500] proxy:7
  91. [ 2/ 9] http://sitio.com/archivo11.txt  [200] proxy:8
  92. [ 1/ 9] http://sitio.com/archivo12.txt  [500] proxy:9
  93. [ 2/ 8] http://sitio.com/archivo12.txt  [500] proxy:2
  94. [ 3/ 8] ...
  95. [ 4/ 8] http://sitio.com/archivo12.txt  [200] proxy:4
  96. [ 1/ 8] http://sitio.com/archivo13.txt  [200] proxy:6
  97. [ 1/ 8] http://sitio.com/archivo14.txt  [500] proxy:8
  98. [ 2/ 6] ...
  99. [ 3/ 6] http://sitio.com/archivo14.txt  [200] proxy:4
  100. [ 1/ 6] http://sitio.com/archivo15.txt  [200] proxy:6
  101. [ 1/ 6] http://sitio.com/archivo16.txt  [500] proxy:1
  102. [ 2/ 6] ...
  103. [ 3/ 6] ...
  104. [ 4/ 6] http://sitio.com/archivo16.txt  [500] proxy:4
  105. [ 5/ 6] ...
  106. [ 6/ 6] http://sitio.com/archivo16.txt  [200] proxy:6
  107. [ 1/ 6] http://sitio.com/archivo17.txt  [500] proxy:6
  108. Renovamos lista de proxies
  109. [ 1/10] http://sitio.com/archivo18.txt  [200] proxy:1
  110. [ 1/10] http://sitio.com/archivo19.txt  [200] proxy:2
  111. [ 1/10] http://sitio.com/archivo20.txt  [200] proxy:3
  112. [ 1/10] http://sitio.com/archivo21.txt  [500] proxy:4
  113. [ 2/10] http://sitio.com/archivo21.txt  [200] proxy:5
  114. [ 1/10] http://sitio.com/archivo22.txt  [200] proxy:6
  115. [ 1/10] http://sitio.com/archivo23.txt  [500] proxy:7
  116. [ 2/10] http://sitio.com/archivo23.txt  [200] proxy:8
  117. [ 1/10] http://sitio.com/archivo24.txt  [500] proxy:9
  118. [ 2/10] http://sitio.com/archivo24.txt  [200] proxy:10
  119. [ 1/10] http://sitio.com/archivo25.txt  [500] proxy:1
  120. [ 2/10] http://sitio.com/archivo25.txt  [500] proxy:2
  121. [ 3/10] http://sitio.com/archivo25.txt  [200] proxy:3
  122. [ 1/10] http://sitio.com/archivo26.txt  [200] proxy:5
  123. [ 1/10] http://sitio.com/archivo27.txt  [200] proxy:6
  124. [ 1/10] http://sitio.com/archivo28.txt  [200] proxy:8
  125. [ 1/10] http://sitio.com/archivo29.txt  [200] proxy:10
  126. [ 1/10] http://sitio.com/archivo30.txt  [200] proxy:3
  127. [ 1/10] http://sitio.com/archivo17.txt  [500] proxy:5
  128. [ 2/10] http://sitio.com/archivo17.txt  [500] proxy:6
  129. [ 3/10] ...
  130. [ 4/10] http://sitio.com/archivo17.txt  [500] proxy:8
  131. [ 5/10] ...
  132. [ 6/10] http://sitio.com/archivo17.txt  [500] proxy:10
  133. [ 7/ 3] ...
  134. [ 8/ 3] http://sitio.com/archivo17.txt  [500] proxy:3
  135. Renovamos lista de proxies
  136. [ 1/10] http://sitio.com/archivo17.txt  [500] proxy:1
  137. [ 2/10] http://sitio.com/archivo17.txt  [500] proxy:2
  138. [ 3/10] http://sitio.com/archivo17.txt  [500] proxy:3
  139. [ 4/10] http://sitio.com/archivo17.txt  [200] proxy:4
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

La idea es copiar la lista de proxies a un array temporal, del que sacaremos el siguiente proxy a usar. Si falla, lo sacamos del array y usamos otro. Si el array queda vacío, reiniciamos el array con la lista de proxies original.

Un detalle: aunque en este código se está usando la instrucción delete() sobre elementos de array, de forma estricta no deberíamos usarlos, porque es posible que deje de funcionar con versiones más modernas de Perl (al menos, hasta la versión 5.12 de Perl, funciona). Lo que hay que usar en su lugar es la instrucción splice().

Si en el código anterior, sustituimos los delete() por splice(), por ejemplo

delete $proxy[$p];

por

splice @proxy, $p, 1;

entonces el programa seguirá funcionando, pero la bajada de las URL no será de forma consecutiva, sino alterna, debido a que estamos modificando la estructura interna de los array, y los contadores internos de los for() y each() no son reajustados con esos cambios, hasta que los bucles son reiniciados de nuevo. Si se quiere, entonces, que las URL sean bajadas de forma consecutiva, habría que ajustar más líneas con más casos, para no incrementar $i y $p en caso de haberse ejecutado un splice().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Código de respuesta

Notapor colorado » 2011-03-09 17:33 @773

Buenísimo, superocurrente tu solución :D .
Exactamente lo que quería.

De momento, en mis pruebas, no estoy teniendo problemas con delete(). Probaré con splice(), para ver las diferencias.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor colorado » 2011-03-13 14:50 @660

Tengo un nuevo problema.

Estoy intentando incorporar Parallel::ForkManager al emulador que creaste.

Le estoy echando bastante imaginación para que funcione correctamente. Pero me estoy perdiendo entre matemáticas, variables, procesos, subprocesos, hijos...

Ya me sale humo de las orejas, tengo el cerebro hecho un nudo, y por más vueltas que le doy, no consigo que el programa termine de funcionar.

Esto es lo máximo que he conseguido acercarme:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3. use autodie;
  4. use Parallel::ForkManager;
  5.  
  6. ## Creación del entorno
  7. my @URL;
  8. for (1 .. 30) {
  9.     push @URL, "http://sitio.com/archivo$_.txt";
  10. }
  11.  
  12. my @PROXY;
  13. for (1 .. 10) {
  14.     push @PROXY, "proxy:$_";
  15. }
  16.  
  17. ## Simulación
  18. my @proxy;
  19. my $p;
  20.  
  21. my $forker      = Parallel::ForkManager->new(3);
  22.  
  23.  
  24. while (@URL) {
  25.  
  26. foreach my $child ( 1 .. 3 ) {
  27.  
  28. $forker->start and next;
  29.  
  30. for (my $t = 0; $t  < $#URL; $t+=3) {
  31. # for my $t ( 0 .. $#URL) { linea eliminada
  32.  
  33.  
  34.  
  35.  
  36.    
  37.     my $url = $URL[$t + $child -1];
  38.         next if not $url;                       # Saltamos los URL vacíos
  39.  
  40.         if (not @proxy) {
  41.             say "Renovamos lista de proxies";
  42.             @proxy = @PROXY;                    # Recargamos la batería de proxies a usar
  43.             $p = (0 + $child -1);
  44.         }
  45.         else {                                  # Buscamos el siguiente proxy más prometedor
  46.             do {
  47.                 $p = (++$p + 3 -1) % @proxy;             # Apuntamos al siguiente proxy...
  48.             } until ($proxy[$p]);               # ... hasta que encontramos uno
  49.         }
  50.  
  51.         for my $intentos ( 1 .. @proxy ) {      # Lo intentamos tantas veces como proxies
  52.  
  53.             printf "[%2d/%2d] ", $intentos, scalar @proxy;
  54.  
  55.             if (not $proxy[$p]) {
  56.                 $p = (++$p + 3 -1) % @proxy;             # Apuntamos al siguiente proxy
  57.                 print "...\n";
  58.                 next;                           # y reintentamos
  59.             }
  60.  
  61.             my $respuesta = pide($url, $proxy[$p]);
  62. print " hijo numero ",$child," ","\n";
  63.  
  64.  
  65.             if ($respuesta == 200) {            # Conseguido
  66.                   delete $URL[$t + $child -1];              
  67.                 last;                           # y probamos con la siguiente
  68.             }
  69.             else {                              # Hubo un fallo
  70.                 delete $proxy[$p];              # quitamos proxy defectuoso
  71.                 last if not @proxy;             # salimos si no nos quedan más
  72.                 $p = ++$p % @proxy;             # Pasamos al siguiente proxy
  73.             }
  74.         }
  75.  
  76. #        die "ERROR: no ha bajado $url con todos los proxies";
  77.  
  78.  
  79.     }
  80.  
  81. $forker->finish;
  82.  
  83. }
  84.  
  85. $forker->wait_all_children;
  86. print "Finalizado.\n";
  87. exit();
  88.  
  89. }
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96. # simula una petición
  97. sub pide {
  98.     my($url, $proxy) = @_;
  99.  
  100.     sleep 1;
  101.  
  102.     my $respuesta = ( 6 > rand 10 ) ? 200 : 500;        # simulamos respuesta
  103.  
  104.     print "$url\t[$respuesta] $proxy \n";
  105.    
  106.  
  107.     return $respuesta;
  108. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



No sé si se podrá aprovechar algo de lo que realicé, o hay alguna otra forma más sencilla de que funcione.

He añadido un exit() en la línea 87, para que acabe el programa una vez finalizadas todas las descargas.
Aunque a veces, el programa se bloquea.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 27 invitados