Plumber: 长请求超时

创建于 2016-08-25  ·  3评论  ·  资料来源: rstudio/plumber

你好 !

我们正在生成一份 PDF 格式的长报告,大约需要 3 分钟,然后我们通过 Plumber 公开它。
HTTP 连接在 1 分 40 秒(100 秒)左右关闭。

所以我们有逻辑错误消息,因为管道工尝试将数据发送到关闭的连接:
ERROR: [on_request_read] connection reset by peer

我认为它可能与 #12 有关,顺便说一下https://github.com/rstudio/httpuv/issues/49

有没有办法在管道工中解决这个问题? 可能是通过在管道工中手动发送类似的东西:

Keep-Alive: timeout=300
Connection: Keep-Alive

但无论如何我们都想避免#12

最好的祝福,
伊曼纽尔

最有用的评论

以防万一有人发现这个问题相关: fork ing 工作得非常好,并且可以使用parallel包轻松完成。

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}

所有3条评论

不幸的是,我对 httpuv 的内部结构不够熟悉,无法明智地谈论为什么会发生这种情况。

不过,退一步说,在其他系统中执行此类长期任务时,通常的模式是立即响应传入的请求,然后异步启动工作。 客户端获得一些 ID 以响应原始请求,然后可以轮询它以找出它何时完成。

不幸的是,R 是单线程的,所以这有点复杂。 但是,如果您有足够的动力,您可以查看 R 进程的fork (请参阅并行或多核包),然后在进程的分支中生成报告,让父进程可用于响应 API 请求(例如正在轮询以查看是否生成报告的客户)。

你好,

在这里,我们已经优化了我们的 R 代码,所以这实际上不是问题。 但在其他情况下,问题可能会再次出现。 如果我找到了解决方案,我会回来并在这里发布。

以防万一有人发现这个问题相关: fork ing 工作得非常好,并且可以使用parallel包轻松完成。

parallel <- function() {
    # Long running calculation here
    print("Sleeping...")
    Sys.sleep(10)
    print("Finished.")
    return(Sys.time())
}

#* <strong i="8">@get</strong> /parallel
parallelTest <- function() {
    parallel::mcparallel(parallel())
    return(TRUE)
}
此页面是否有帮助?
0 / 5 - 0 等级