mcparallel
位于 parallel
包(package)。 说明
这些函数基于分叉,因此在 Windows 上不可用。
mcparallel
开始并行R计算给定表达式的过程。
mccollect
从一个或多个并行进程收集结果。
用法
mcparallel(expr, name, mc.set.seed = TRUE, silent = FALSE,
mc.affinity = NULL, mc.interactive = FALSE,
detached = FALSE)
mccollect(jobs, wait = TRUE, timeout = 0, intermediate = FALSE)
参数
expr |
要计算的表达式(请勿在此代码中使用任何屏幕设备或 GUI 元素,请参阅 |
name |
可以与作业关联的可选名称(长度为 1 的字符向量)。 |
mc.set.seed |
逻辑:参见“随机数”部分。 |
silent |
如果设置为 |
mc.affinity |
指定 CPU 的数值向量以将子进程限制为(从 1 开始)或 |
mc.interactive |
逻辑上,如果 |
detached |
逻辑上,如果 |
jobs |
要收集结果的作业(或单个作业)列表。或者 |
wait |
如果设置为 |
timeout |
检查作业结果的超时(以秒为单位) - 仅在 |
intermediate |
|
细节
mcparallel
评估expr
与电流并行的表达式R过程。并行进程和当前进程之间的所有内容都是只读共享的(或者实际上copy-on-write),即表达式的side-effects不会影响主进程。可以使用以下方式收集并行执行的结果mccollect
函数。
mccollect
函数从并行作业(或实际上任何子进程)收集任何可用结果。如果 wait
是 TRUE
,则 collect
将等待所有指定作业完成,然后返回包含每个作业的最后报告结果的列表。如果wait
是FALSE
,则mccollect
仅检查当前可用的结果,而不会等待作业完成。如果指定jobs
,则未列出的作业将不会受到影响或执行。
注意:如果 expr
使用低级多核函数,例如 sendMaster
,单个作业可以多次交付结果,用户有责任正确解释它们。对于已发送结果且作业不再可用的终止作业,mccollect
将为该作业返回 NULL
。
作业由进程 ID 标识(即使称为作业对象),操作系统会重复使用这些 ID。因此,mcparallel
创建的分离作业永远无法通过其进程 ID 或作业对象安全引用。非分离作业保证存在,直到被 mccollect
收集,即使崩溃或被信号终止。一旦被 mccollect
收集,作业就被视为已分离,因此不能再通过其进程 ID 或作业对象来引用。对于 wait = TRUE
,将收集传递给 mccollect
的所有作业。对于 wait = FALSE
,收集的作业以结果向量的名称给出,因此在对 mccollect
的后续调用中必须排除这些作业。只要 API 接受作业对象,就应优先使用进程 ID。
mc.affinity
参数可用于尝试将子进程限制到特定的 CPU。此函数的可用性和范围取决于系统(例如,某些系统将仅考虑 CPU 数量,其他系统将完全忽略它)。
值
mcparallel
返回 "parallelJob"
类的对象,该类继承自 "childProcess"
(请参阅 mcfork
帮助的“值”部分)。如果提供了参数 name
,这将有一个附加组件 name
。
mccollect
返回列表中可用的任何结果。结果将与指定作业的顺序相同。如果有多个作业并且一个作业有一个名称,它将用于命名结果,否则将使用其进程 ID。如果没有指定的子进程仍在运行,则返回 NULL
。
随机数
如果mc.set.seed = FALSE
,子进程具有与当前进程相同的初始随机数生成器 (RNG) 状态R会议。如果 RNG 已被使用(或.Random.seed
从保存的工作区恢复),孩子将在与当前会话相同的点开始绘制随机数。如果尚未使用 RNG,则子进程将在首次使用 RNG 时根据时间和进程 ID 设置种子:这几乎可以保证提供与当前会话和任何其他子进程不同的随机数流过程。
仅当选择了 RNGkind("L'Ecuyer-CMRG")
时,mc.set.seed = TRUE
的行为才会有所不同。然后,每次子进程被分叉时,它都会被赋予下一个流(参见nextRNGStream
)。因此,如果您选择该生成器,设置种子并在第一次使用 mcparallel
之前调用 mc.reset.stream
,则只要为第一个、第二个……分叉进程提供相同的任务,模拟结果将是可重现的。
注意
之前R3.4.0 和 32 位平台上,base serialize每个分叉进程的 d 结果仅限于 字节。 (通过序列化返回非常大的结果效率低下,应该避免。)
例子
p <- mcparallel(1:10)
q <- mcparallel(1:20)
# wait for both jobs to finish and collect all results
res <- mccollect(list(p, q))
## IGNORE_RDIFF_BEGIN
## reports process ids, so not reproducible
p <- mcparallel(1:10)
mccollect(p, wait = FALSE, 10) # will retrieve the result (since it's fast)
mccollect(p, wait = FALSE) # will signal the job as terminating
mccollect(p, wait = FALSE) # there is no longer such a job
## IGNORE_RDIFF_END
# a naive parallel lapply can be created using mcparallel alone:
jobs <- lapply(1:10, function(x) mcparallel(rnorm(x), name = x))
mccollect(jobs)
作者
Simon Urbanek and R Core.
Derived from the multicore
package formerly on
CRAN. (but with different handling of the RNG stream).
也可以看看
相关用法
- R mcfork 分叉当前 R 进程的副本
- R mcaffinity 获取或设置当前进程的CPU亲和性掩码
- R mclapply 使用 Forking 的 lapply 和 mapply 并行版本
- R makeCluster 创建并行套接字集群
- R pvec 使用 Forking 并行化向量映射函数
- R children 用于管理分叉进程的低级函数
- R clusterApply 使用集群应用操作
- R RNGstreams Pierre L'Ecuyer 的 RngStreams 的实施
- R detectCores 检测CPU核心数
- R splitIndices 划分任务在集群中分布
- R SparkR partitionBy用法及代码示例
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr list_transpose 转置列表
- R purrr as_vector 将列表强制转换为向量
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr map_depth 在给定深度映射/修改元素
- R SparkR printSchema用法及代码示例
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr rerun 多次重新运行表达式
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Evaluate an R Expression Asynchronously in a Separate Process。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。