future 等待在单核机器上执行
future waits for execution on single-core machine
我有 2 台机器具有相同版本的 Ubuntu (16.04)、R (3.4.4) 和未来包 (1.10.0)。我是运行下面的代码,实现了异步编程
tic()
library(future)
plan(multisession)
mehAsync = function(){
future::future({
Sys.sleep(5)
return('meh')
})
}
out = mehAsync()
what = then(out,function(value){(value)})
toc()
预期的行为是执行几乎立即结束,留下未决的承诺。在一台机器上发生这种情况,执行立即发生。但是在我的另一台机器上,执行等待 mehAsync 函数执行,5 秒后完成。
如前所述,两台机器几乎相同。它们之间的主要区别在于较慢的是单核机器。但是根据我的理解,multisession
计划不应该需要多核。足够的资源来打开机器拥有的新 R 会话。
这里的具体问题是:
- 我对预期行为的理解有误吗?这对于单核机器来说是正常的吗?
- 我没有考虑到的其他哪些因素可能会影响此行为?
- 由于没有 error/warning 消息并且无法由我自己和其他人在独立机器上复制,我该如何调试这个问题?
注意:在尝试调查时出现了这个问题
multisession
计划的默认选项在单核计算机中将 workers
参数设置为 availableCores()
。这意味着如果在使用 plan
时不重写参数,核心数量确实很重要。
正在做
plan(multisession,workers=2)
解决了这个问题
我有 2 台机器具有相同版本的 Ubuntu (16.04)、R (3.4.4) 和未来包 (1.10.0)。我是运行下面的代码,实现了异步编程
tic()
library(future)
plan(multisession)
mehAsync = function(){
future::future({
Sys.sleep(5)
return('meh')
})
}
out = mehAsync()
what = then(out,function(value){(value)})
toc()
预期的行为是执行几乎立即结束,留下未决的承诺。在一台机器上发生这种情况,执行立即发生。但是在我的另一台机器上,执行等待 mehAsync 函数执行,5 秒后完成。
如前所述,两台机器几乎相同。它们之间的主要区别在于较慢的是单核机器。但是根据我的理解,multisession
计划不应该需要多核。足够的资源来打开机器拥有的新 R 会话。
这里的具体问题是:
- 我对预期行为的理解有误吗?这对于单核机器来说是正常的吗?
- 我没有考虑到的其他哪些因素可能会影响此行为?
- 由于没有 error/warning 消息并且无法由我自己和其他人在独立机器上复制,我该如何调试这个问题?
注意:在尝试调查时出现了这个问题
multisession
计划的默认选项在单核计算机中将 workers
参数设置为 availableCores()
。这意味着如果在使用 plan
时不重写参数,核心数量确实很重要。
正在做
plan(multisession,workers=2)
解决了这个问题