且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

提交作业到异步事件循环

更新时间:2022-06-08 22:40:44

我的请求成功了,并且此处.

My request made its way and a run_coroutine_threadsafe function has been implemented here.

示例:

def target(loop, timeout=None):
    future = asyncio.run_coroutine_threadsafe(add(1, b=2), loop)
    return future.result(timeout)

async def add(a, b):
    await asyncio.sleep(1)
    return a + b

loop = asyncio.get_event_loop()
future = loop.run_in_executor(None, target, loop)
assert loop.run_until_complete(future) == 3


我最初发布了 concurrent的子类.futures.Executor 仍可以实现为:


I originally posted a sub-class of concurrent.futures.Executor that can still be implemented as:

class LoopExecutor(concurrent.futures.Executor):
    """An Executor subclass that uses an event loop 
    to execute calls asynchronously."""

    def __init__(self, loop=None):
        """Initialize the executor with a given loop."""
        self.loop = loop or asyncio.get_event_loop()

    def submit(self, fn, *args, **kwargs):
        """Schedule the callable, fn, to be executed as fn(*args **kwargs).
        Return a Future object representing the execution of the callable."""
        coro = asyncio.coroutine(fn)(*args, **kwargs)
        return asyncio.run_coroutine_threadsafe(coro, self.loop)