何かがそれを行う必要があります。
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
ロックは、おそらくこのような場合には必要ありませんが、それを持って傷つけることはできません。
@mata私はそうは思わない、それはまだメインスレッドとは別の1つのスレッドを作成するだろう。 –
もちろん、あなたは正しいです。しかし、それは送信時に直接呼び出し可能関数を呼び出し、 'Future'オブジェクトを返す' Executor'を実装するにはあまりにも複雑ではありません。 ['ThreadPoolExecutor'](http://code.google.com/p/pythonfutures/source/browse/trunk/concurrent/futures/thread.py#98)が役立つかもしれない – mata
あなたがする前にいつもシンプルに見えるそれはあなたがそれをした後ではありません。誰かがすでにこれを実装している場合は、私はそれらの準備が整った実装を使用することが非常に望ましいです。 –