2012-05-03 10 views
7

El paquete futures de Python nos permite disfrutar de ThreadPoolExecutor y ProcessPoolExecutor para realizar tareas en paralelo.`DummyExecutor` para 'futuros' de Python

Sin embargo, para la depuración a veces es útil reemplazar temporalmente el paralelismo verdadero por uno ficticio, que lleva a cabo las tareas en serie en el hilo principal, sin engendrar hilos o procesos.

¿Hay alguna implementación de DummyExecutor?

+0

@mata No lo creo, eso crearía un hilo que aún estará separado del hilo principal. –

+0

por supuesto, tienes razón. pero entonces no debería ser demasiado complicado implementar un 'Ejecutor' que al enviar directamente llama al invocable y devuelve un objeto 'Futuro'. Un vistazo a la ['ThreadPoolExecutor'] (http://code.google.com/p/pythonfutures/source/browse/trunk/concurrent/futures/thread.py#98) podría ayudar – mata

+0

Siempre se ve simple antes de hacerlo esto, pero no siempre después de que lo hagas. Si alguien ya implementó esto, es preferible que use su implementación lista. –

Respuesta

5

Algo así debe hacerlo: probablemente no se necesita

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 

de bloqueo en este caso, pero no puede hacer daño a tenerlo.

Cuestiones relacionadas