Página 1 de 1

Problema con hilos

NotaPublicado: 2016-07-25 15:14 @676
por jimr1984
Hola, buenas tardes.

Por favor, si pueden ayudarme con los hilos, necesito realizar lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
primer cuadro
^^^^^^^^^^^^^^^^
Cargando.........
1
Resultado:
1 + 1 = 2
^^^^^^^^^^^^^^^^
segundo cuadro
^^^^^^^^^^^^^^^^
Cargando.........
2
Resultado:
2 + 1 = 3
^^^^^^^^^^^^^^^^
tercer cuadro
^^^^^^^^^^^^^^^^
Cargando.........
3
Resultado:
3 + 1 = 4
^^^^^^^^^^^^^^^^
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Nota: mientras va apareciendo el número en Cargando
debajo de Resultado éste va operando con los números que ya le devuelve en Cargando.

Sin que la ejecución se detenga en Cargando...

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2.  
  3. use  threads;
  4. use strict;
  5. use threads::shared;
  6.  
  7.  
  8. my @compartida :shared = 0 ;
  9.  
  10. print "Cargando........\n";
  11.  
  12.  
  13. my $hilo = threads->create(&hiloA);
  14.  
  15.  #&hiloA();  <--- hiloA es un proceso que es muy largo demora bastante tiempo y  puede ir devolviendo resultados conforme va terminando,  ( sin necesidad de esperar a que termine el proceso para devolver todo los valores y guardarlos en el array)
  16. lo que no se quiere es justamente esperar a que termine este proceso
  17. lo contrario ir almacenando en el array  mientras vaya arrojando valores.
  18.  
  19. sub hiloA
  20. {
  21.  
  22. my $i=0;
  23. while ($i <= 10)
  24.    {
  25.                 sleep(2); <-- simular retardo  asumimos que este procedimiento es pesado y demora bastante
  26.                 push  (@compartida,$i);  <-- voy almacenando en u array los valores del 1 al 10
  27.                 $i = $i + 1;
  28.         }
  29.  
  30. }
  31.  
  32. my $rpta  = $hilo->join();
  33.  
  34.  
  35. print "Respuesta.. \n";
  36.  
  37.  
  38. foreach (@compartida)
  39. {
  40.  
  41.         print " $_ + 1 = ".$_ + 1."\n";
  42.  
  43.        
  44. }
  45.  
  46.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Este ejemplo lo planteo de esta manera para hacerlo más comprensible del problema original.

Re: Problema con hilos

NotaPublicado: 2016-07-26 12:41 @570
por explorer
No se recomienda para nada seguir usando el threads de Perl porque... realmente no estamos manipulando hilos del sistema, sino unos pseudo-hilos inventados por Perl. Hay otras opciones más modernas, como Any::Event, que engloba muchas otras soluciones.

En cuanto al código, no estoy seguro de lo que quieres hacer, pero si la idea es que no quieres que el programa se detenga en el punto situado después de lanzar el hilo, lo que tienes que hacer es ejecutar lo que quieras. El hilo seguirá trabajando por su cuenta.

Si lo que quieres es desligar completamente el nuevo hilo creado del programa que lo creó, tienes que hacer un detach().

Re: Problema con hilos

NotaPublicado: 2016-07-26 15:57 @706
por jimr1984
Hola, el problema original es el siguiente:

Tengo un array: @numero_movil, compartido.

Estoy realizando un script de scrapping con el cual extraigo cierta información de http://www.ejemplo.com

La información extraída es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Movil:   72152362
Movil:   72752565
Movil:   72552566
Movil:   72252567
Movil:   72352568
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Con el método:
sub Extraer_info {
// aquí mi código, extrayendo información y almacenando en push @numero_movil,$i
// se realizan muchas peticiones GET
// se podría realizar múltiple o peticiones paralelas GET
}

Luego tengo otro método:

sub Rastrear_movil {
//que revisa si @numeros_movil va conteniendo datos y esto lo utiliza para consultar en una web:
//leer @numeros_movil y recorrer cada elemento y realizar peticiones GET con el número:
//www.buscador.com/numero.php?=72352568
//extraer información
}

El problema radica en el proceso Extraer_info (datos de números móvil de http://www.ejemplo.com Es un proceso largo, es decir, demora bastante y me devuelve mucha información).

Mientras este proceso NO termine no se ejecuta el proceso Rastrear_movil.

Entonces buscaba una solución que me permita ir avanzando y NO esperar a que termine Extraer_info, es decir, Rastrear_movil debería estar consultando (extrayendo shift() del inicio del arreglo).

En resumen, no se tendría que esperar a que termine el proceso de Extraer_info para que Rastrear_movil empiece.

Rastrear_movil puede ir trabajando con los datos que vaya cargando el método anterior mientras éste va AGREGANDO DATOS AL ARREGLO EL OTRO VA QUITÁNDOLOS O UTILIZÁNDOLOS.

Si lo vemos de otro puntos de vista podría ser de forma sincronizada: cargo un número y utilizo un número.

espero hayan entendido mi consulta.

Re: Problema con hilos

NotaPublicado: 2016-07-27 04:45 @239
por explorer
Lo que no dices es dónde dejas la información recolectada por Rastrear_movil().

Pero da igual: se puede simplificar el problema, y ahorrarte el array compartido.

Lo único que tienes que hacer (hay varias formas de hacerlo, sin embargo), es modificar Extraer_info() para que, cuando termine con la petición GET, llame a Rastrear_movil() directamente (pasándole el móvil como argumento, por ejemplo). Y éste se encargará de sacar el resto de la información.

Es decir: que una función llame a la otra. Te ahorras estructuras intermedias.

La segunda función podría guardar el resultado en un hash compartido, cuya clave sea el número de móvil, por ejemplo.