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()