• Publicidad

Problema con hilos

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Problema con hilos

Notapor jimr1984 » 2016-07-25 15:14 @676

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.001 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.010 segundos, usando GeSHi 1.0.8.4

Este ejemplo lo planteo de esta manera para hacerlo más comprensible del problema original.
jimr1984
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 96
Registrado: 2012-11-25 07:11 @341

Publicidad

Re: Problema con hilos

Notapor explorer » 2016-07-26 12:41 @570

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().
JF^D Perl Programming
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 13930
Registrado: 2005-07-24 18:12 @800
Ubicación: Madrid, España

Re: Problema con hilos

Notapor jimr1984 » 2016-07-26 15:57 @706

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.
jimr1984
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 96
Registrado: 2012-11-25 07:11 @341

Re: Problema con hilos

Notapor explorer » 2016-07-27 04:45 @239

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.
JF^D Perl Programming
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 13930
Registrado: 2005-07-24 18:12 @800
Ubicación: Madrid, España


Volver a Avanzado

¿Quién está conectado?

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