Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/02/2014, 13:04
SARGE553413
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 10 años, 9 meses
Puntos: 3
Duda con hilos y futures en Python

Hola a todos

Estoy intentando crear una clase en Python, para instanciar objetos que luego usare con el método "submit()" de ThreadPoolExecutor.
Se supone que los objetos tienen que leer un fichero (pasado como param.), buscar su línea mas larga, y devolverla. Este valor devuelto debería ser un future por lo que entiendo.

Para ello creo una clase normal, pero le define el método __call__(), para luego pasarle a submit una instancia de dicha clase, y que utilice el mñetodo __call__(), pero no se si ésto está bien pensado.

El programa funciona, pero se ejecuta de forma secuencial.

No se qué hacer, me he leído la doc, de python varias veces. Creo que no entiendo muy bien el método __call__() y el ThreadPoolExecutor.

Realmente quier "imitar" lo que en java ser haría con una clase implementando Runnable<T> y Future<T>.

Gracias de antemano.

Adjunto el código. Una es la clase "callable" en cuestión, el de abajo es como el "main".

Código:
import threading

class FileThreadCall:
    """
    Thread that reads a file and returns
    this file largest line
    """
    
    def __init__(self,file):
        """
        Contructor
        """
        self.f=file
    
    def __call__(self):
        """
        This method will be called by the
        'submit()' function of 'ThreadPoolExecutor'
        class object 
        """
        return self.__largerLine()
    
    def __largerLine(self):
        """
        search the largest self.f's file
        """
        line=""; aux=""
        for line in self.f:
            if len(line) > len(aux):
                aux=line
        return aux


Código:
from FileThreadCall import *
from concurrent.futures import Executor
from concurrent.futures.thread import ThreadPoolExecutor

def main():
    try:
        fichs = {"f1":open("pr","r"),
                  "f2":open("pr2","r"),
                  "f3":open("pr3","r")}
        future = []
        exe=ThreadPoolExecutor(3)
        for i in range(3):
            future.append(
                exe.submit(FileThreadCall(
                  fichs.get(
                    "f"+str(i+1))
                  )
               )
            )
        for i in range(3):
            print(future[i].result())
    finally:
        for i in range(3):
            fichs.get("f"+str(i+1)).close()
    pass

main()