如何在Python中实现类Node.js的异步Map函数处理API请求?
Python实现异步批量调用第三方API的方案
情况1:第三方API是同步阻塞函数
如果get_user_handle是同步的网络请求函数(比如基于requests实现),直接用asyncio会阻塞事件循环,无法实现真正并行。这时需要用线程池将同步函数包装为异步可调用对象,再批量执行。
Python 3.9+ 实现代码
import asyncio from API import get_user_handle async def async_map(arr, func): # 将同步函数转为异步任务 tasks = [asyncio.to_thread(func, item) for item in arr] # 并发执行所有任务并收集结果 return await asyncio.gather(*tasks) async def main(): arr = [1234, 2345, 6789] new_arr = await async_map(arr, get_user_handle) print(new_arr) # 示例输出: ['Tom', 'Amy', 'Jerry'] if __name__ == "__main__": asyncio.run(main())
Python 3.8及以下版本兼容实现
import asyncio from concurrent.futures import ThreadPoolExecutor from API import get_user_handle async def async_map(arr, func): executor = ThreadPoolExecutor() loop = asyncio.get_running_loop() # 通过线程池执行同步函数 tasks = [loop.run_in_executor(executor, func, item) for item in arr] return await asyncio.gather(*tasks) async def main(): arr = [1234, 2345, 6789] new_arr = await async_map(arr, get_user_handle) print(new_arr) if __name__ == "__main__": asyncio.run(main())
情况2:第三方API本身是异步函数
如果get_user_handle已经是用async def定义的异步函数,直接用asyncio.gather批量执行即可:
import asyncio from API import get_user_handle # 假设这是异步函数 async def async_map(arr, func): tasks = [func(item) for item in arr] return await asyncio.gather(*tasks) async def main(): arr = [1234, 2345, 6789] new_arr = await async_map(arr, get_user_handle) print(new_arr) if __name__ == "__main__": asyncio.run(main())
关键说明
- 上述
async_map即对应你需求中的async_foreach(更贴合“映射转换”的语义)。 - Python异步代码必须在
asyncio事件循环中运行,因此不能像同步代码那样直接调用async_map,必须用await关键字在异步函数内触发,再通过asyncio.run()启动事件循环。 - 线程池适配IO密集型任务(如网络请求),能避免同步调用时的等待时间叠加,大幅提升效率。
内容的提问来源于stack exchange,提问作者Julian Chu
相关产品推荐
相关产品推荐

