你好 !
我们正在生成一份 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
最好的祝福,
伊曼纽尔
不幸的是,我对 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)
}
最有用的评论
以防万一有人发现这个问题相关:
fork
ing 工作得非常好,并且可以使用parallel
包轻松完成。