Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/03/2014, 10:59
SARGE553413
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 10 años, 9 meses
Puntos: 3
Respuesta: Duda con hilos y futures en Python

Cita:
Iniciado por AlvaroG Ver Mensaje
Primero: no importes módulos que no necesitas, solamente complican la lectura del código (threading en tu primer listado, Executor en el segundo). Además, estás importando los símbolos de FileThreadCall.py pero no la clase en sí. Cuidado con eso.
No entiendo lo de importar solo los símbolos y la clase, voy a buscar info sobre esto, de todas formas si alguien quiere aclarármelo se lo agradeceré mucho.

Cita:
Iniciado por AlvaroG Ver Mensaje
Segundo: Python no tiene un método "main", pero tiene una solución idiomática para la misma funcionalidad.
Tampoco entiendo a que te refieres, buscaré info también acerca de esto, de nuevo las explicaciones serán muy bien recibidas.

Cita:
Iniciado por AlvaroG Ver Mensaje
Tercero: utiliza los iteradores correctamente. No es necesario que uses las formas de comprensión de listas, pero al menos no utilices índices cuando no es necesario.
Tomo nota.

Cita:
Iniciado por AlvaroG Ver Mensaje
Hechas estas aclaraciones, y luego de ver la documentación del módulo, creo que el problema está en la forma en la que estás mostrando los resultados. Estás llamando al método result() de cada future secuencialmente, cuando lo que hace este método es esperar hasta que el future termina y luego devolver el resultado.

Es decir, en tu bucle for esperas hasta que futures[0] termine, luego a que 1 termine, y luego a que 2 termine. Es ese bloque el que determina que obtengas los resultados secuencialmente.

Para obtener los resultados a medida que se van obteniendo, usa la función as_completed del módulo futures, tal y como está en el ejemplo aquí: [url]http://docs.python.org/dev/library/concurrent.futures.html#threadpoolexecutor-example[/url]

Cambia tu bucle (línea 10 en el código anterior) por:
Código Python:
Ver original
  1. for f in concurrent.futures.as_completed(future):
  2.     print(f.result())


Saludos.
Vale, voy a probar eso, muchas gracias por la aclaración.

Bueno gracias en general por las respuestas, en especial por esta que es muy completa.

PD. Entonces asumo que está bien hecho lo de crear una clase y definir el método __call__() para así hacerla "callable" y que la instanciar el objeto se llame a este método directamente.

EDITO. funciona perfectamente, muchas gracias.

Última edición por SARGE553413; 09/03/2014 a las 11:11