• Publicidad

Resolver 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.

Resolver problema con hilos

Notapor jimr1984 » 2019-02-05 16:16 @719

Hola, comunidad. Tengo un problema a resolver. Por favor, si pueden ayudarme.

Necesito demostrar la diferencia del uso de hilo en un script y otro sin hilos.

Tengo una página PHP local: prueba.php

La cual tiene como código de validación 7588 y una entrada la cual se debe ingresar un código el cual es validado.
No utiliza BD. Es un código muy sencillo. Por ejemplo:

prueba.php:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
código generado :  7588

Ingrese un código : ________________________________
[ ENVIAR ]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Tengo un archivo (codigos.txt del 0000 al 9999)

Voy a crear dos script.pl: sinhilo.pl y conhilo.pl

Los cuales demuestren la diferencia en milisegundos al encontrar el código correcto en el archivo prueba.php

El script sinhilo.pl recorrerá en orden ascendente toda la lista de números incluidos en el archivo codigos.txt, validando en prueba.php para encontrar el resultado correcto. Son 7588 peticiones que debe realizar y esto quizás se complicaría más si hubiera base de datos, etc. Una vez encontrado el código correcto debe mostrar el tiempo transcurrido (ESTO LO REALIZARÉ YO).

El segundo script conhilo.pl es el que necesito de su ayuda. No sé cómo empezar o por dónde partir para realizar este ejemplo. La idea es que se creen 5 hilos que accedan al archivo y lo lean así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
hilo 1 :   0000 - 2000
hilo 2 :   2000 - 4000
hilo 3 :   4000 - 6000
hilo 4 :   6000 - 8000
hilo 5 :   8000 - 9999
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Entonces tendremos 5 hilos trabajando con diferentes cantidades. Una vez encontrado el código deberá mostrar el tiempo transcurrido y el número del hilo que encontró el valor.

En este ejemplo, por lógica, si el código de autenticación es 7588, el hilo que encontrará el valor correcto es el hilo 4 y lo encontrará en x milisegundos.

Por favor, espero puedan ayudarme con algún ejemplo, sobre todo se los agradecería mucho.

Saludos.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Publicidad

Re: Resolver problema con hilos

Notapor explorer » 2019-02-05 19:28 @853

Lamento decírtelo, pero no vas a conseguir tu propósito de demostrar la diferencia de tiempo. Hay varios problemas:
  • el número de códigos a probar es muy pequeño (menos de 10 000), así que en un sistema de validación agnóstica, siempre ganará la búsqueda secuencial, ya que en la solución con hilos se pierde mucho tiempo creándolos. Tendría más sentido en una cantidad mayor de códigos
  • en la validación estás involucrando el PHP, que, vete tú a saber qué eficiente es. Y si lo ejecutas detrás de un servidor web, la solución puede ser peor todavía. Lo ideal es que la validación fuera agnóstica (no depender de casi nada para decir si el código es bueno o no
Si aún así quieres continuar con el experimento, te aconsejo el uso del módulo AnyEvent, y de alguno de los que depende, porque así tendrás un interfaz común para diversas técnicas de programación concurrente.

Yo no suelo utilizar hilos, más bien prefiero usar forks de procesos, utilizando alguno de los módulos de la familia Parallel, como es el caso de Parallel::Tiny. Bueno, más bien, el último que he usado es Parallel::Loops. En tu caso, sería calcular los 5 rangos, y arrancar un proceso por cada uno de ellos. Si uno de los hilos encuentra la respuesta, la saca por la salida estándar y termina.

Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Parallel::Loops;
  2. use Time::HiRes qw(gettimeofday tv_interval);
  3.  
  4. my $maxProcs = 5;
  5. my $pl = Parallel::Loops->new($maxProcs);
  6.  
  7. my @rangos = ( 0, 2000, 4000, 6000, 8000 );
  8.  
  9. my $tv_inicio = [gettimeofday];                # tiempo en este momento
  10.  
  11. $pl->foreach( \@rangos, sub {
  12.     my $valor_inicial = $_;
  13.     my $valor_final   = $_ + 1999;
  14.  
  15.     for my $code ($valor_inicial .. $valor_final) {
  16.         my $codigo = sprintf "%04d", $code;
  17.  
  18.         # ... comprobar aquí si el $codigo es válido ...
  19.  
  20.         if ($valido) {
  21.             my $tv_fin = [gettimeofday];                # tiempo en este momento
  22.  
  23.             say "Válido en rango [$valor_inicial,$valor_final]";
  24.             say "Tiempo: ", tv_interval($tv_inicio, $tv_fin), " segundos";
  25.  
  26.             last;
  27.         }
  28.     }
  29. });
Coloreado en 0.002 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Resolver problema con hilos

Notapor jimr1984 » 2019-02-06 17:25 @767

Gracias por la respuesta.

Estoy poniendo en practica tu ejemplo. Muchas gracias. Un favor.

En la secuencia de número necesito que sea de 4 dígitos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0001
0002
0003
...
2000
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y así sucesivamente.

Actualmente está corriendo desde 0 .. 100 .. 500 .. 1000, etc.

Por favor, si pueden ayudarme. Gracias.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Resolver problema con hilos

Notapor explorer » 2019-02-06 20:00 @875

Con el sprintf "%04d" ya rellenas con cero.

Lo tienes explicado en perlfaq4.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Resolver problema con hilos

Notapor jimr1984 » 2019-02-06 23:36 @025

Muchas gracias por las prontas ayudas.

La solución que se presentó, gracias a los ejemplos, dio un resultado satisfactorio.

Muchas gracias a todos por su ayuda.

Me gustaría solicitar ayuda con otro tema de hilos en este mismo hilo continuando esto para no abrir otro.

Tengo un formulario php: login.php el cual acepta 4 dígitos: 0000 - 9999.

En este caso ¿la solución aplicada anteriormente es posible adaptarla? ¿o alguna otra solución?

El código de validación es un número aleatorio entre 0000 a 9999. Ejemplo: 5454.

Según lo recomendado anteriormente realicé una petición desde el 0000 al 9999 pero demora mucho tiempo.

La idea para solucionar esto es dividir el rango en 5 hilos y que cada hilo realice la petición en un rango y el hilo que encuentre el valor correcto muestre OK (correcto) y detenga los otros hilos.

¿Esto debería ser más rápido?
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Resolver problema con hilos

Notapor explorer » 2019-02-07 06:56 @330

Lo más complicado es decirle al resto de hilos que se paren cuando se ha encontrado el código.

Una forma sencilla es: crear una variable compartida entre todos los hilos, y ponerla en verdadero si se encuentra el código. Y luego modificar los bucles interiores para que comprueben el estado de esa variable para salir del bucle.

Pero esto no funciona con sistemas de fork, solo con hilos.

Si quieres usar fork, podrías usar un sistema de señales entre procesos como IPC::Msg o IPC::Shm.

Quizás... con IPC::Run lo tengas todo solucionado (arranque de procesos, esperar respuesta, matar procesos).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Resolver problema con hilos

Notapor jimr1984 » 2019-02-12 09:57 @456

Entonces, ¿tu recomendación sería utilizar hilos?

Estoy buscando cuál sería la solución más óptima a realizar.

Tengo un formulario login.php el cual recibe un parámetro login.php?clave=XXXX
La clave comprende un número entre [0000 - 9999] Si realizo una request GET que recorra desde 0000 hasta 9999 seguro encontraré el valor correcto pero, ¿cuánto demoraré?

La idea es dividir el trabajo en 5 hilos y que cada hilo realice la búsqueda del código correcto y cuando alguno de los hilos lo encuentre ordene que se detengan los otros hilos y continúe la ejecución del script con el valor obtenido.

El login.php devuelve:
un código de respuesta (response) válido es {code_erro:0} ; cuando se dio con el valor correcto
un código de respuesta (response) inválido es {code_erro:1}


Me gustaría tener un pequeño ejemplo de base si es posible, gracias.

PD: el login.php valida el código en un BD mysql
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341

Re: Resolver problema con hilos

Notapor explorer » 2019-02-12 10:39 @485

A las malas, se puede resolver con forks, usando un archivo como bandera de que se ha encontrado el código, y de esa manera, terminar los bucles de búsqueda.

Más claro: al principio del problema me aseguro que el archivo .encontrado no existe (lo mando borrar, por ejemplo).

Luego pongo en marcha los forks, como se ha indicado en el mensaje anterior. Cada fork recorre un rango distinto.

En cada vuelta del bucle (o cada 5 o 10 vueltas), comprobamos si existe el archivo .encontrado. Si existe, terminamos y salimos rápidamente del bucle. Si no existe, seguimos buscando. Si el php nos devuelve verdadero, entonces creamos el archivo .encontrado y salimos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Resolver problema con hilos

Notapor jimr1984 » 2019-02-12 11:08 @505

Por favor, ¿puede proporcionarme algunos ejemplos o dónde puedo obtener un ejemplo de partida para lograr mi objetivo?

Con hilos y fork. Gracias de antemano.
jimr1984
Perlero nuevo
Perlero nuevo
 
Mensajes: 123
Registrado: 2012-11-25 07:11 @341


Volver a Avanzado

¿Quién está conectado?

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