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

如何实现Ray Task异步处理以并发执行外部API请求?

解决Ray任务在IO等待时的并发问题

要实现10个任务的API请求并行执行,核心是让任务在等待外部API响应时释放CPU资源,让Ray可以调度其他任务运行。具体可以通过以下步骤实现:

1. 替换同步HTTP库为异步库

requests是同步阻塞的,会一直占用CPU直到请求完成。改用异步HTTP库如aiohttp,让任务在等待IO时让出CPU。

2. 将Ray任务改为异步函数

Ray支持异步任务(async def),当任务执行到await语句时,会自动释放CPU资源,允许其他任务调度执行。

完整代码示例

import ray
import aiohttp

# 初始化Ray
ray.init()

@ray.remote
async def fetch(url):
    # 使用异步HTTP客户端发起请求
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            # 等待API响应,此时Ray会释放CPU给其他任务
            result = await response.json()
            # 后续处理逻辑(API返回后执行)
            return result

# 发起10个异步任务
urls = ["https://api.example.com/data"] * 10
tasks = [fetch.remote(url) for url in urls]

# 等待所有任务完成
results = ray.get(tasks)
print(results)

原理说明

  • 当调用fetch.remote()创建10个任务后,Ray会将这些任务放入调度队列。
  • 第一个任务开始执行,当执行到await response.json()时,任务进入IO等待状态,Ray会立即释放它占用的CPU资源,调度队列中的下一个任务执行。
  • 这样10个任务会同时发起API请求,并行等待响应,直到各自的API返回后,再依次完成后续处理逻辑。
  • 即使只有1个CPU,也能实现所有API请求的并行执行,因为IO等待期间CPU被充分复用。

注意事项

  • 确保安装了aiohttp:pip install aiohttp
  • 异步任务中避免使用同步阻塞操作,否则会重新占用CPU导致无法并发
  • 如果需要复用HTTP连接池,可以将ClientSession的创建移到任务外部,通过Ray的Actor或者共享对象传递(简单场景下每个任务创建独立Session也可正常运行)

内容的提问来源于stack exchange,提问作者zacko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:39:57