2012-05-03 63 views
7

Il pacchetto Python futures ci consente di utilizzare ThreadPoolExecutor e ProcessPoolExecutor per eseguire attività in parallelo.`DummyExecutor` per i` futures 'di Python

Tuttavia, per eseguire il debug a volte è utile sostituire temporaneamente il parallelismo reale con uno fittizio, che esegue le attività in modo seriale nel thread principale, senza generare thread o processi.

Esiste ovunque un'implementazione di DummyExecutor?

+0

@mata Non credo, creerebbe un thread che sarà ancora separato dal thread principale. –

+0

ovviamente hai ragione. ma allora non dovrebbe essere troppo complicato implementare un 'Executor' che su submit chiama direttamente il callable e restituisce un oggetto' Future'. Un'occhiata a ['ThreadPoolExecutor'] (http://code.google.com/p/pythonfutures/source/browse/trunk/concurrent/futures/thread.py#98) potrebbe aiutare – mata

+0

Sembra sempre semplice prima di fare ma non sempre dopo averlo fatto. Se qualcuno lo ha già implementato, è molto preferibile che io usi la sua implementazione pronta. –

risposta

5

Qualcosa del genere dovrebbe farlo:

from concurrent.futures import Future, Executor 
from threading import Lock 


class DummyExecutor(Executor): 

    def __init__(self): 
     self._shutdown = False 
     self._shutdownLock = Lock() 

    def submit(self, fn, *args, **kwargs): 
     with self._shutdownLock: 
      if self._shutdown: 
       raise RuntimeError('cannot schedule new futures after shutdown') 

      f = Future() 
      try: 
       result = fn(*args, **kwargs) 
      except BaseException as e: 
       f.set_exception(e) 
      else: 
       f.set_result(result) 

      return f 

    def shutdown(self, wait=True): 
     with self._shutdownLock: 
      self._shutdown = True 


if __name__ == '__main__': 

    def fnc(err): 
     if err: 
      raise Exception("test") 
     else: 
      return "ok" 

    ex = DummyExecutor() 
    print(ex.submit(fnc, True)) 
    print(ex.submit(fnc, False)) 
    ex.shutdown() 
    ex.submit(fnc, True) # raises exception 

di blocco non è probabilmente necessario in questo caso, ma non può far male per averlo.