Python的'期货'的'DummyExecutor`

Ram*_*hum 16 python debugging concurrency future concurrent.futures

Python的futures软件包允许我们并行地享受ThreadPoolExecutorProcessPoolExecutor完成任务.

但是,对于调试,暂时用虚拟并行替换真正的并行性有用,它在主线程中以串行方式执行任务,而不会产生任何线程或进程.

有没有实现的DummyExecutor

mat*_*ata 13

这样的事情应该这样做:

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
Run Code Online (Sandbox Code Playgroud)

在这种情况下可能不需要锁定,但是不能让它受伤.