当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R mcparallel 在单独的进程中异步计算 R 表达式


R语言 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 元素,请参阅 mcfork 了解不建议将 mcparallel 与 GUI front-ends 和多线程库一起使用)。原始向量保留供内部使用,无法返回,但表达式可以计算,例如到包含原始向量的列表。 NULL 不应返回,因为 mccollect 使用它来发出错误信号。

name

可以与作业关联的可选名称(长度为 1 的字符向量)。

mc.set.seed

逻辑:参见“随机数”部分。

silent

如果设置为 TRUE 则 stdout 上的所有输出都将被抑制(stderr 不受影响)。

mc.affinity

指定 CPU 的数值向量以将子进程限制为(从 1 开始)或 NULL 以不修改 CPU 关联性

mc.interactive

逻辑上,如果TRUEFALSE则子进程将分别设置为交互式或非交互式。如果NA,则子进程将从父进程继承交互标志。

detached

逻辑上,如果 TRUE 则作业与当前会话分离,并且无法返回任何结果 - 它仅用于代码副作用。

jobs

要收集结果的作业(或单个作业)列表。或者jobs也可以是进程ID的整数向量。如果省略 collect 将等待所有当前存在的子项。

wait

如果设置为FALSE,它将检查从现在起timeout秒内可用的任何结果,否则它将等待所有指定的作业完成。

timeout

检查作业结果的超时(以秒为单位) - 仅在 waitFALSE 时适用。

intermediate

FALSEcollect 等待结果时将调用的函数。该函数将使用一个参数来调用,该参数是迄今为止收到的结果列表。

细节

mcparallel评估expr与电流并行的表达式R过程。并行进程和当前进程之间的所有内容都是只读共享的(或者实际上copy-on-write),即表达式的side-effects不会影响主进程。可以使用以下方式收集并行执行的结果mccollect函数。

mccollect 函数从并行作业(或实际上任何子进程)收集任何可用结果。如果 waitTRUE,则 collect 将等待所有指定作业完成,然后返回包含每个作业的最后报告结果的列表。如果waitFALSE,则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).

也可以看看

pvec , mclapply

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Evaluate an R Expression Asynchronously in a Separate Process。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。