Submit a job to an asyncio event loop

后端 未结 1 534
独厮守ぢ
独厮守ぢ 2021-02-14 18:59

I would like to submit jobs from a thread to an asyncio event loop (just like run_in_executor but the other way around).

Here\'s what the asyncio

1条回答
  •  梦毁少年i
    2021-02-14 19:35

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

    Example:

    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
    

    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)
    

    0 讨论(0)
提交回复
热议问题