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ó.
@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. –
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
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ọ. –