1

如果您需要示例,请告诉我,但我认为没有必要。

我编写了一个 for 循环,它生成期货并将每个结果存储在一个列表中。它plan是远程的,比如说,由一台互联网机器上的 4 个节点组成。

在部署了第 4 个 future 并且远程机器的所有核心都忙后,R 挂起,直到其中一个空闲。由于我没有使用任何本地内核,为什么它必须挂起?这是改变这种行为的方法吗?

4

1 回答 1

3

未来框架的作者在这里。此行为是设计使然。

您的主 R 会话有一定数量的可用工作人员。工人的数量取决于您制定的未来计划。您可以随时通过调用来检查设置的工人数量nbrOfWorkers()。在您的情况下,您有四个远程工作人员,这意味着nbrOfWorkers()返回4

nbrOfWorkers()您可以随时激活此数量的期货 (= ) 而不会阻塞。当你试图再创造一个未来时,没有更多的工人可以承担它。此时,唯一的选择就是阻止。

现在,您可能会问:当远程工作人员都很忙时,我该如何使用我的本地机器?

实现这一目标的最简单方法是在远程工作人员的组合中添加一名本地工作人员。例如,如果您允许自己在本地机器上使用两个工人,您可以这样做:

library(future)
remote_workers <- makeClusterPSOCK(c("n1.remote.org", "n2.remote.org"))
local_workers <- makeClusterPSOCK(2)
plan(cluster, workers = c(remote_workers, local_workers))

甚至只是

library(future)
remote_workers <- c("n1.remote.org", "n2.remote.org")
local_workers <- rep("localhost", times = 2)
plan(cluster, workers = c(remote_workers, local_workers))
于 2020-04-10T03:44:52.793 回答