How to combine python asyncio with threads?

前端 未结 3 2010
死守一世寂寞
死守一世寂寞 2020-11-28 04:41

I have successfully built a RESTful microservice with Python asyncio and aiohttp that listens to a POST event to collect realtime events from various feeders.

It the

3条回答
  •  难免孤独
    2020-11-28 05:07

    I also used run_in_executor, but I found this function kinda gross under most circumstances, since it requires partial() for keyword args and I'm never calling it with anything other than a single executor and the default event loop. So I made a convenience wrapper around it with sensible defaults and automatic keyword argument handling.

    from time import sleep
    import asyncio as aio
    loop = aio.get_event_loop()
    
    class Executor:
        """In most cases, you can just use the 'execute' instance as a
        function, i.e. y = await execute(f, a, b, k=c) => run f(a, b, k=c) in
        the executor, assign result to y. The defaults can be changed, though,
        with your own instantiation of Executor, i.e. execute =
        Executor(nthreads=4)"""
        def __init__(self, loop=loop, nthreads=1):
            from concurrent.futures import ThreadPoolExecutor
            self._ex = ThreadPoolExecutor(nthreads)
            self._loop = loop
        def __call__(self, f, *args, **kw):
            from functools import partial
            return self._loop.run_in_executor(self._ex, partial(f, *args, **kw))
    execute = Executor()
    
    ...
    
    def cpu_bound_operation(t, alpha=30):
        sleep(t)
        return 20*alpha
    
    async def main():
        y = await execute(cpu_bound_operation, 5, alpha=-2)
    
    loop.run_until_complete(main())
    

提交回复
热议问题