4

我用来future_lapply()在 Linux 机器上并行我的代码。如果我提前终止进程,则只有一名工作人员被释放,并行进程继续存在。我知道我可以进入tools::pskill(PID)以结束每个单独的进程,但这很乏味,因为我在 26 个内核上运行。

如果有办法从 R 对 linux 进行系统调用以获取所有活动的 PID?

我这样设置future_lapply

# set number of workers
works <- 26
plan(multiprocess, workers = works)
future_lapply(datas, function(data) {
  # do some long processes
}

如果我终止进程并运行,top我仍然会看到: 在此处输入图像描述

因为我的并行会话仍在运行。

使用会话信息更新:
version.string R 版本 3.6.2 (2019-12-12)
future 1.12.0
future.apply 1.2.0

4

1 回答 1

4

我希望这有帮助。

require(future)
works <- 26
plan(multiprocess, workers = works)
future_lapply(datas, function(data) {
  # do some long processes
})

# get all PIDs of the r processess
v <- listenv::listenv()  # requires listenv package
for (ii in 1:works) {
   v[[ii]] %<-% {
         Sys.getpid()
     }
}

for (i in 1:works) {
  #For windows
  system(sprintf("taskkill /F /PID %s", v[[i]]))

  #For Linux
  system(sprintf("kill -9 %s", v[[i]]))
}

祝你有美好的一天。

于 2020-01-08T20:43:48.273 回答