elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Python]Duda con thread
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Python]Duda con thread  (Leído 2,692 veces)
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
[Python]Duda con thread
« en: 9 Mayo 2015, 05:13 am »

Hola a todos, saben tengo una duda a ver si me pueden ayudar con la idea, intentaré ser lo más específico y sencillo ya que entiendo que se requieren detalles para que me puedan ayudar.

Tengo una lista de muchos datos, usaré como ejemplo una lista de muchos números:

Código
  1. lista = [1, 9, 2, 12, 5, 2, 0, 123, 32, 4, .........] # (miles)

pretendo hacer una serie de operaciones matemáticas (como ejemplo sacar la raíz de cada número) con cada número de la lista, pero si lo hago uno por uno, no terminaría nunca.

por lo cual mi idea sería usar Threads para solventar mi problema.

aquí la pregunta:

¿Cómo podría hacer para que se vayan tomando de a 4 (por dar un ejemplo de num.) valores de la lista y estos una vez que terminen, tomen otros 4 más?

No sé si se entienda, pero la idea sería como hacer un buffer de 4 operaciones matemáticas (uno en cada thread) si una termina, o dos, se vuelvan a crear otros thread, es decir que siempre se estén realizando operaciones matemáticas (4 a la vez) hasta que se termine toda la lista completa?

Que difícil explicar mi duda, si me dieran un ejemplo estaría más que feliz.

Muchas gracias y saludos.


« Última modificación: 9 Mayo 2015, 05:16 am por Eleкtro » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.817



Ver Perfil
Re: [Python]Duda con thread
« Respuesta #1 en: 9 Mayo 2015, 07:16 am »

Creo que se ha entendido a la perfección lo que pretendes hacer, no te preocupes :P, aquí te escribo este ejemplo bien documentado!.

Basicamente inicio una cantidad específica de threads (4) a los que les voy pasando tareas que realizar, es decir, una cantidad específica de valores que procesar, en este ejemplo es 1 valor por thread, por lo que siempre hay 4 threads activos procesando de forma asíncrona 1 valor de la pila de valores.

Código
  1. # -*- coding: Windows-1252 -*-
  2. from Queue import Queue; from threading import Thread, current_thread
  3.  
  4. # El trabajo que realizará cada hilo.
  5. def MathWorker(queue):
  6.    # El While mantiene activo el hilo para aceptar nuevas tareas.
  7.    while True:
  8.        # print current_thread().getName() + " work started."
  9.        # Itero los valores del siguiente item en la cola.
  10.        for value in queue.get():
  11.            # Hacer operaciones aritméticas aquí.
  12.            print "value: " + str(value)
  13.  
  14.        queue.task_done()
  15.        # print current_thread().getName() + " work done." + "\n"
  16.  
  17. # La colección de valores.
  18. valueList = [
  19.              1, 2, 3, 4,
  20.              5, 6, 7, 8,
  21.              9
  22.            ]
  23.  
  24. # La cola (o pila) de espera.
  25. mathQueue = Queue(maxsize=0)
  26.  
  27. # La cantidad máxima de hilos simultaneos.
  28. maxThreads = 4
  29.  
  30. # La cantidad máxima de valores simultaneos por hilo.
  31. maxValues = 1
  32.  
  33. # Voy insertando los valores simultaneos por hilo, en la cola (o pila) de espera.
  34. for index in range(0, len(valueList), maxValues): # range(start, stop, step)
  35.    mathQueue.put(valueList[index:(index+maxValues)])
  36.  
  37. # Inicio los hilos.
  38. for value in range(maxThreads):
  39.    worker = Thread(target=MathWorker, args=(mathQueue,))
  40.    worker.setDaemon(True)
  41.    worker.start()
  42.  
  43. # Espero a que la cola (o pila) se vacie.
  44. mathQueue.join()

Esta linea la he documentado 'print current_thread().getName()' por que queda muy feo cuando hay varios threads activos debido a la asincronía, pero este sería el resultado de ejecución con un solo thread activo:

Código:
Thread-1 work started.
value: 1
Thread-1 work done.

Thread-1 work started.
value: 2
Thread-1 work done.

Thread-1 work started.
value: 3
Thread-1 work done.

Thread-1 work started.
value: 4
Thread-1 work done.

y así hasta el 9...

PD: Me ha tocado desempolvar Python y volver a instalarlo, que practicamente no lo uso nunca pa nah, pero te lo mereces :).

Saludos!


« Última modificación: 9 Mayo 2015, 09:40 am por Eleкtro » En línea

.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: [Python]Duda con thread
« Respuesta #2 en: 9 Mayo 2015, 07:46 am »

Eres un mounstrillo, más tarde lo probaré, de verdad muchísimas gracias, al verlo a simple vista estoy más que seguro que es lo que busco, muchísimas gracias :D
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: [Python]Duda con thread
« Respuesta #3 en: 11 Mayo 2015, 07:35 am »

Hola electro, te comento que me funciona a la perfección pero tengo un pequeño problema y es que tengo la posibilidad de que se produzcan errores dentro de MathWorker por lo cual intenté con poner un bloque TRY and EXCEPT pero no funciona, ya que se queda esperando en mathQueue.join().

Mi pregunta sería: ¿Cómo puedo manejar una excepción dentro de MathWorker sin estropear la idea principal (se realizan cuatro tareas pero que todas terminen)?

Saludos y gracias nuevamente
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.817



Ver Perfil
Re: [Python]Duda con thread
« Respuesta #4 en: 11 Mayo 2015, 10:40 am »

Mi pregunta sería: ¿Cómo puedo manejar una excepción dentro de MathWorker sin estropear la idea principal (se realizan cuatro tareas pero que todas terminen)?

Si estás controlando correctamente la excepción entonces no se debería detener la ejecución del thread.

Creo que vas a tener que mostrar lo que tengas escrito en el bloque del except:, y el tipo de excepción que te lanza.

Recuerda que siempre puedes utilizar la declaración pass para ignorar la excepción:

Código
  1. ...
  2. for value in queue.get():
  3.    try:
  4.        0 + str(value)
  5.    except BaseException as e:
  6.        # print e.message, e.args
  7.        pass
  8. queue.task_done()
  9. ...

saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado]Duda funcionamiento Thread/Hilos
Java
NetJava 6 4,779 Último mensaje 25 Marzo 2011, 16:29 pm
por NetJava
#include <thread/AsyncCallback.h> #include <thread/Runnable.h>
Programación C/C++
Codename!! 0 2,087 Último mensaje 15 Agosto 2011, 21:31 pm
por Codename!!
Python kill thread
Scripting
nikther 1 5,530 Último mensaje 9 Mayo 2012, 17:14 pm
por nikther
Duda con Thread ?
.NET (C#, VB.NET, ASP)
TrashAmbishion 8 3,120 Último mensaje 22 Agosto 2016, 16:18 pm
por TrashAmbishion
Problema al iniciar un THREAD python
Scripting
Panic0 2 8,123 Último mensaje 17 Julio 2021, 22:51 pm
por Panic0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines