我对未来的套餐有疑问。在我的任务中,我尝试设置一个异步过程。我是用Futures做的。如果我第一次运行我的脚本(在一个干净的RSession中)一切正常,并按预期工作。在同一个R Session中第二次运行相同的功能,在无休止的等待时间内结束。执行在期货开始的行中停止。没有错误被抛出。守则只是永远运行。如果我手动中断代码,则从该行调用浏览器: Sys.sleep(间隔)。 通过以下方式执行此操作的呼叫来自: 来自:socketSelect(list(con),write = FALSE,timeout = timeout)。
我编写了一个小程序,它的结构与我的脚本基本相同,并且会出现同样的问题。虽然在这个小例子中并不明显,但这个结构在我的原始代码中有一些优势:
library(future)
library(parallel)
asynchronousfunction <- function(){
Threads.2.start <- availableCores()
cl <- parallel::makePSOCKcluster(Threads.2.start)
plan(cluster, workers = cl)
threads <- lapply(1:Threads.2.start, function(index){
future::cluster({Sys.getpid()},persistent = TRUE, workers = cl[[index]])
})
while(!any(resolved(threads))){
Sys.sleep(0.1)
}
threads <- lapply(1:Threads.2.start, function(index){
future::cluster({Sys.getpid()},persistent = TRUE, workers = cl[[index]])
})
stopCluster(cl = cl)
}
asynchronousfunction() # First call to the function. Everything is working fine.
asynchronousfunction() #Second call to the function. Endless Execution.
我正在使用Windows 10,R版本是3.4.2。包版本是1.6.2。
我希望你们能帮助我。
提前致谢。
最诚挚的问候,
哈佛
答案 0 :(得分:1)
作者future
在这里。看起来你已经试图过度使用它,我并不是100%肯定你想要实现的目标。对我来说可疑的事情是你使用:
cluster()
- 请致电future()
。cluster(..., workers = cl[[index]])
- 在设置未来时不要指定workers
。persistent = TRUE
?resolve(threads)
基本上与您的while()
循环相同。value()
或values()
。option(future.debug = TRUE)
获取有关幕后内容的详细信息。如果我将您的示例重写为现在的示例,那么一个工作示例将如下所示:
library("future")
asynchronousfunction <- function() {
n <- availableCores()
cl <- makeClusterPSOCK(n)
plan(cluster, workers = cl)
fs <- lapply(1:n, function(index) {
future({ Sys.getpid() }, persistent = TRUE)
})
## Can be replaced by resolve(fs)
while(!any(resolved(fs))) {
Sys.sleep(0.1)
}
fs <- lapply(1:n, function(index) {
future({ Sys.getpid() }, persistent = TRUE)
})
parallel::stopCluster(cl = cl)
}
您可以使用lapply()
,而不是滚动自己的future()
+ future_lapply()
吗?例如,
asynchronousfunction <- function() {
n <- availableCores()
cl <- makeClusterPSOCK(n)
plan(cluster, workers = cl)
pids <- future_lapply(1:n, function(ii) {
Sys.getpid()
})
str(pids)
pids <- future_lapply(1:n, function(ii) {
Sys.getpid()
})
str(pids)
parallel::stopCluster(cl = cl)
}