我正在尝试构建一个在AWS ECS上运行并涉及包{future}、{future.callr}和{furrr}的 dockerized R 微服务(因此隐含{callr}和{processx})
当我使用限制为1 个 CPU和650 MB内存的 docker 容器进行本地测试时(与我的客户的舞台设置相匹配;生产有1500 MB和4 个 CPU),一切正常。
但是,在实际的 AWS 实例上,我收到以下错误:
错误一:
Error in get_result(out, private$options) :
callr subprocess failed: could not start R, exited with non-zero status, has crashed or was killed
错误2:
Error in rethrow_call(c_processx_exec, command, c(command, args), stdin, :
Cannot fork when running '/usr/local/lib/R/bin/R' (system error -12, Unknown error -12) @unix/processx.c:499 (processx_exec)
我在这里完全超出了我的深度,谁能给我一个提示,告诉我发生了什么和/或我该如何解决这个问题?
在这个问题上提供一个代表有点困难,但这里是一般设置的主要要点:
确保后台进程
ensure_background_processes <- function(workers_level_1, workers_level_2){
future::plan(
list(
future::tweak(future.callr::callr, workers = workers_level_1),
future::tweak(future.callr::callr, workers = workers_level_2)
)
)
}
处理两个操作“同时”发生的包装函数,其中每个操作需要在 3 个实体上并行化(x
例如长度为 3)
foo <- function(x) {
future::future({
x %>%
furrr::future_map(
~.x %>% bar()
)
})
future::future({
x %>%
furrr::future_map(
~.x %>% baz()
)
})
}
每个并行化周期中要执行的实际功能
bar <- function(x) {
# Do something useful in a while loop
}
baz <- function(x) {
# Do something useful in a while loop
}