Ver Mensaje Individual
  #5 (permalink)  
Antiguo 04/03/2014, 10:44
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda con hilos y futures en Python

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.

Segundo: Python no tiene un método "main", pero tiene una solución idiomática para la misma funcionalidad.

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.

Tu segundo listado es equivalente al siguiente bloque:
Código Python:
Ver original
  1. from archivo_donde_esta_FileThreadCall import FileThreadCall
  2. from concurrent.futures.thread import ThreadPoolExecutor
  3.  
  4. if __name__ == '__main__':
  5.     try:
  6.         fichs = [ open('pr'), open('pr2'), open('pr3') ]
  7.         exe=ThreadPoolExecutor(3)
  8.         future = [ exe.submit(FileThreadCall(file)) for file in fichs ]
  9.  
  10.         for f in future:
  11.             print(f.result())
  12.  
  13.     finally:
  14.         for file in fichs:
  15.             file.close()

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í: http://docs.python.org/dev/library/c...ecutor-example

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.