过早停止 运行 mcparallel 作业
stop a running mcparallel job prematurely
我有三个任务:
- 磁盘 I/O 绑定
- 网络I/O绑定
- CPU绑定在远程机器上
3的结果会告诉我我想要的答案是来自任务1还是任务2。由于每个任务都需要单独的资源,所以我想用mcparallel启动所有三个任务,然后等待结果从第三个任务并确定是否终止任务 1 或任务 2。但是,我无法确定如何从 R 中过早地取消 mcparallel 任务。通过调用 system( )?如果不是,是否有更好的方法来取消不需要的计算?
我认为 parallel
软件包不支持终止通过 mcparallel
启动的进程的官方方式,但我猜这样做是安全的,您可以使用 [= tools
包中的 13=] 函数来完成它。这是一个例子:
library(parallel)
library(tools)
fun1 <- function() {Sys.sleep(20); 1}
fun2 <- function() {Sys.sleep(20); 2}
fun3 <- function() {Sys.sleep(5); sample(2, 1)}
f1 <- mcparallel(fun1())
f2 <- mcparallel(fun2())
f3 <- mcparallel(fun3())
r <- mccollect(f3)
if (r[[1]] == 1) {
cat('killing fun1...\n')
pskill(f1$pid)
print(mccollect(f1))
r <- mccollect(f2)
} else {
cat('killing fun2...\n')
pskill(f2$pid)
print(mccollect(f2))
r <- mccollect(f1)
}
print(r)
在多线程应用程序中随机终止线程通常是危险的,因为它们可能持有某种共享锁,但这些当然是进程,主进程似乎可以很好地处理这种情况。
当前版本的 parallel::mccollect() 支持 wait
参数。
只需传递 FALSE 即可过早退出任何 运行 作业。
> mccollect(wait = FALSE)
我有三个任务:
- 磁盘 I/O 绑定
- 网络I/O绑定
- CPU绑定在远程机器上
3的结果会告诉我我想要的答案是来自任务1还是任务2。由于每个任务都需要单独的资源,所以我想用mcparallel启动所有三个任务,然后等待结果从第三个任务并确定是否终止任务 1 或任务 2。但是,我无法确定如何从 R 中过早地取消 mcparallel 任务。通过调用 system( )?如果不是,是否有更好的方法来取消不需要的计算?
我认为 parallel
软件包不支持终止通过 mcparallel
启动的进程的官方方式,但我猜这样做是安全的,您可以使用 [= tools
包中的 13=] 函数来完成它。这是一个例子:
library(parallel)
library(tools)
fun1 <- function() {Sys.sleep(20); 1}
fun2 <- function() {Sys.sleep(20); 2}
fun3 <- function() {Sys.sleep(5); sample(2, 1)}
f1 <- mcparallel(fun1())
f2 <- mcparallel(fun2())
f3 <- mcparallel(fun3())
r <- mccollect(f3)
if (r[[1]] == 1) {
cat('killing fun1...\n')
pskill(f1$pid)
print(mccollect(f1))
r <- mccollect(f2)
} else {
cat('killing fun2...\n')
pskill(f2$pid)
print(mccollect(f2))
r <- mccollect(f1)
}
print(r)
在多线程应用程序中随机终止线程通常是危险的,因为它们可能持有某种共享锁,但这些当然是进程,主进程似乎可以很好地处理这种情况。
当前版本的 parallel::mccollect() 支持 wait
参数。
只需传递 FALSE 即可过早退出任何 运行 作业。
> mccollect(wait = FALSE)