我希望使用此 RStudio 视频中演示的 Plumber+Future 模式来构建一个 Plumber API,以充分利用多个可用内核。
在我的特殊情况下,有一些缓慢/昂贵的初始模型加载操作我想确保在会话/线程启动时最初发生,而不是根据请求按需重复。
正如我从多会话示例中了解到的那样,会话范围内的变量将被复制,并且工作人员中的操作不会影响主线程(示例b
可以rm(pid)
并且pid
变量仍然存在于主线程中)
...但是我不是 100% 清楚这些会话变量在未来之外的生命周期,例如pid
:当每个 R 会话被创建然后重新用于每个未来时,它们是否会预先独立初始化?每次创建未来时,是否会从主线程发生一些内存复制?
具体来说,如果我有类似下面的N
CPU/会话设置:
future::plan(multisession)
model <- loadMyFancyModel()
#' Model inference route
#' @post /invocations
function(req) {
scoring_X <- [...]
future::future({
return(paste(predict(model, scoring_X, row.names=FALSE), collapse=','))
})
}
- 是否会在启动时
loadMyFancyModel
被调用,初始化每个会话它自己的副本,然后将其重新用于它要处理的任何未来调用?N
model
- 如果
req
比 大/复杂得多scoring_X
,但提取 的scoring_X
计算简单,那么在主线程中将其范围缩小是否有任何进程间通信好处,如上所示?或者未来的工人会话是否会req
因为它在范围内而收到?