如果某个函数在本质上是阻塞的而不是异步的,则在
asyncio事件循环内运行该函数的唯一正确方法是使用run_in_executor在线程内运行该函数:
# Our example blocking functionsimport timedef queryFoo(): time.sleep(3) return 'foo'def queryBar(): time.sleep(3) return 'bar'# Run them using asyncioimport asynciofrom concurrent.futures import ThreadPoolExecutor_executor = ThreadPoolExecutor(10)async def in_thread(func): loop = asyncio.get_event_loop() return await loop.run_in_executor(_executor, func)async def main(): results = await asyncio.gather( in_thread(queryFoo), in_thread(queryBar), ) print(results)if __name__ == "__main__": loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.run_until_complete(loop.shutdown_asyncgens()) loop.close()
它确实起作用。
但是,如果您想避免使用线程的唯一方法是-重写
queryFoo/
queryBar本质上是异步的。



