2012-05-03 27 views
7

của Python futures cho phép chúng ta thưởng thức ThreadPoolExecutorProcessPoolExecutor để thực hiện các tác vụ song song.`DummyExecutor` cho gói` futures`

Tuy nhiên, để gỡ lỗi đôi khi rất hữu ích để tạm thời thay thế song song thực sự bằng một giả, thực hiện nhiệm vụ theo cách nối tiếp trong chuỗi chính mà không sinh ra bất kỳ luồng hoặc quy trình nào.

Có nơi nào triển khai DummyExecutor không?

+0

@mata Tôi không nghĩ như vậy, điều đó sẽ tạo một chuỗi sẽ vẫn tách biệt khỏi chuỗi chính. –

+0

tất nhiên là bạn đúng. nhưng sau đó nó không nên quá phức tạp để thực hiện một 'Executor' mà trên trình trực tiếp gọi các callable và trả về một' Future' đối tượng. Một cái nhìn ['ThreadPoolExecutor'] (http://code.google.com/p/pythonfutures/source/browse/trunk/concurrent/futures/thread.py#98) có thể giúp – mata

+0

Nó luôn trông đơn giản trước khi bạn làm nó, nhưng không phải luôn luôn sau khi bạn làm điều đó. Nếu ai đó đã triển khai thực hiện điều này, thì tốt hơn là tôi nên sử dụng triển khai sẵn sàng của họ. –

Trả lời

5

Something như thế này nên làm điều đó:

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 

khóa có lẽ không cần thiết trong trường hợp này, nhưng không thể làm tổn thương để có nó.

Các vấn đề liên quan