其美妙之mclapply
处在于,工作进程都是在mclapply
被调用的点上作为主进程的克隆创建的,因此您不必担心在每个集群工作人员上复制您的环境。不幸的是,这在 Windows 上是不可能的。
使用时parLapply
,您通常必须执行以下附加步骤:
- 创建 PSOCK 集群
- 如果需要,注册集群
- 在集群工作人员上加载必要的包
- 将必要的数据和功能导出到集群工作者的全局环境
此外,完成后,最好使用stopCluster
.
这是您的示例的翻译parLapply
:
library(parallel)
cl <- makePSOCKcluster(4)
setDefaultCluster(cl)
adder <- function(a, b) a + b
clusterExport(NULL, c('adder'))
parLapply(NULL, 1:8, function(z) adder(z, 100))
如果您的adder
函数需要一个包,则必须在使用parLapply
. 你可以很容易地做到这一点clusterEvalQ
:
clusterEvalQ(NULL, library(MASS))
请注意, 和 的第一个NULL
参数表示它们应该使用通过 注册的集群对象。如果您的程序在许多不同的函数中使用,这将非常有用,这样您就不必在将程序转换为 use 时将集群对象传递给每个需要它的函数。clusterExport
clusterEval
parLapply
setDefaultCluster
mclapply
parLapply
当然,adder
可能会调用全局环境中调用其他函数等的其他函数。在这种情况下,您还必须导出它们并加载它们需要的任何包。另请注意,如果您导出的任何变量在程序过程中发生变化,您必须再次导出它们才能在集群工作程序上更新它们。同样,这不是必需的,mclapply
因为它总是在调用时创建/克隆/分叉工人,因此没有必要。