You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:08:14