2012-05-14 3 views
2

J'essaie d'améliorer les performances d'un script en utilisant ThreadPoolExecutor de concurrent.futures. Je lance des scripts python externes via Popen et les encapsule en tant qu'objets futurs, mais ces objets entrent dans la fonction de rappel comme terminée, mais je peux les voir fonctionner sur ma machine (ils fonctionnent pendant quelques minutes). Le code ressemble à ceci:concurrent.futures ThreadPoolExecutor n'attend pas?

with futures.ThreadPoolExecutor(max_workers=4) as executor: 
     p1 = executor.submit(subprocess.Popen([myotherPythonscript1], stdout = subprocess.PIPE)) 
     p1.add_done_callback(process_result) 
     p2 = executor.submit(subprocess.Popen([myotherPythonscript2], stdout = subprocess.PIPE)) 
     p2.add_done_callback(process_result) 

def process_result(future): 
     logger.info("Seeding process finished...") 

J'ai aussi essayé différentes approches en cours d'exécution avec() et attendre() futures fonctions, mais avec les mêmes résultats. Les objets futurs sont marqués comme déjà fait, mais en fait ils sont toujours en cours d'exécution. Ai-je raté quelque chose?

Merci,

Répondre

4

vous ne pouvez pas passer seulement le résultat de Popen à votre exécuteur testamentaire, vous devez passer un appelable.

>>> from concurrent.futures import * 
>>> from subprocess import * 
>>> executor = ThreadPoolExecutor(4) 
>>> future = executor.submit(Popen(['echo', 'test'], stdout=PIPE)) 
>>> future.exception() 
TypeError("'Popen' object is not callable",) 

ce d'autre part fonctionne:

from concurrent.futures import * 
from subprocess import * 

def make_call(): 
    process = Popen(['echo', 'test'], stdout=PIPE) 
    return process.communicate()[0] 

executor = ThreadPoolExecutor(4) 
future = executor.submit(make_call) 
print(future.result()) 
+0

Il résolu en partie mon problème. J'ai dû inclure un sous-programme check_pid pour que tous mes threads fonctionnent en même temps, car avec la fonction de communication(), Popen attendait la fin du processus. Je vous remercie! – fernandinand

Questions connexes