gpt4 book ai didi

r - 如何在 R 中执行并行异步 POST API 调用?

转载 作者:行者123 更新时间:2023-12-04 17:50:18 27 4
gpt4 key购买 nike

我在 AWS Lambda 上创建了一个 API 端点,我使用 POST 请求(使用 JSON 数据输入)调用它以获取结果作为响应(作为 JSON 数据输出)。

现在我有 100 万个数据表需要使用 API 进行处理。一次 API 执行大约需要 600 毫秒,而 AWS Lambda 允许每秒最多 3000 个请求。为了更快地执行,我想使用我系统中的所有 64 个内核来生成 64 个并发请求,但我不希望这些请求在生成下一个 64 个请求之前等到它们得到响应(结果)等等(基本上我想要达到 3000 个请求阈值)。为此,我需要异步生成请求,每个请求不等待它的响应,一旦生成响应,将其附加到一个大列表或 data.table

我查看了 curlRcurlfuturedoFuture 包文档,但无法查看找到解决这个问题的任何东西。任何帮助将不胜感激

我在 this post 上发现了类似的问题但答案并不完整。

在异步 foreach(或类似功能的函数)中运行的示例伪代码:

output = foreach(i = 1:n) %dopar%
{
x = input[i]
body = toJSON(x)
url = "https://exampleURL.amazonaws.com/dev/LambdaTest"
response = as.data.table(fromJSON(content(POST(url,
body = body,
content_type_json()))))
return(response)
}

这里的data是包含n个需要单独传递的子集的data.table。

最佳答案

您可以使用crul 包。它有两个异步接口(interface),Async 用于许多被相同对待的 URL,以及 AsyncVaried,您可以在任何配置中构造 HTTP 请求,然后将它们传递给 AsyncVaried 处理那些异步请求

library(crul)

形成请求

req1 <- HttpRequest$new(
url = "https://httpbin.org/post",
headers = list(`Content-Type` = "application/json")
)$post(body = jsonlite::toJSON(iris[1,]))
req2 <- HttpRequest$new(
url = "https://httpbin.org/post",
headers = list(`Content-Type` = "application/json")
)$post(body = jsonlite::toJSON(iris[2,]))

创建一个 AsyncVaried 对象

out <- AsyncVaried$new(req1, req2)

做请求

out$request()

获取状态码、标题等

out$status_code()

获取 json 响应并解析为 R 列表

lapply(out$parse(), jsonlite::fromJSON)

关于r - 如何在 R 中执行并行异步 POST API 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com