mcfork
位于 parallel
包(package)。 说明
这些是低级函数,在 Windows 上不可用,并且不从命名空间导出。
mcfork
创建一个新的子进程作为当前进程的副本R过程。
mcexit
关闭当前子进程,并根据需要通知主进程。
用法
mcfork(estranged = FALSE)
mcexit(exit.code = 0L, send = NULL)
参数
estranged |
逻辑上,如果 |
exit.code |
进程退出代码。按照惯例, |
send |
如果不是 |
细节
mcfork
函数提供了一个接口fork
系统调用。此外,它在主进程和子进程之间建立了一个管道,可用于将数据从子进程发送到主进程(请参阅sendMaster
)和孩子的‘标准输入’被重新映射到主进程持有的另一个管道(参见sendChildStdin
)。
如果您不熟悉fork
系统调用,不要直接使用此函数,因为它会导致非常复杂的inter-process交互R涉及的流程。
简而言之,fork
生成当前进程的副本(子进程),它可以与主进程(父进程)并行工作。在分叉时,两个进程共享完全相同的状态,包括工作空间、全局选项、加载的包等。分叉在现代操作系统中相对便宜,并且不会创建所用内存的真实副本,而是两个进程共享相同的内存,并且仅复制修改过的部分。这使得mcfork
成为并行处理的理想工具,因为无需设置并行工作环境,数据和代码从一开始就自动共享。
mcexit
将在子进程中运行。它将 send
发送到主进程(除非 NULL
),然后关闭子进程。还可以通过向子进程发送信号 SIGUSR1
来关闭子进程,就像未导出的函数 parallel:::rmChild
所做的那样。
值
mcfork
将类 "childProcess"
的对象返回给主类,并将类 "masterProcess"
的对象返回给子类:这两个类都继承自类 "process"
。如果estranged
设置为TRUE
,则子进程将属于"estrangedProcess"
类,并且无法与主进程通信,也不会显示在子进程列表中。这些列表包含组件 pid
(另一个进程的进程 ID)和向量 fd
,该向量由两个文件说明符编号组成,用于 inter-process 管道的当前进程的末端。
mcexit
永远不会返回。
GUI/嵌入式环境
强烈建议不要在 GUI 或嵌入式环境中使用 mcfork
以及依赖它的高级函数(例如 mcparallel
、 mclapply
和 pvec
),因为这会导致多个进程共享同一 GUI这可能会导致混乱(甚至可能崩溃)。子进程永远不应该使用屏幕上的图形设备。已采取一些预防措施使其可在 macOS 上的 R.app
中使用,但第三方 front-ends 的用户应查阅其文档。
这也可以应用于分叉之前创建的其他连接(例如,到 X 服务器),以及由例如打开的文件。图形设备。
请注意,tcltk
算作用于这些目的的 GUI,因为 Tcl
运行事件循环。该事件循环在子进程中被禁止,但 Tk 图形连接仍然可能存在问题。
强烈建议不要在任何多线程 R 进程(带有由第三方库或包创建的附加线程)中使用 mcfork
和更高级别的函数。这种使用可能会导致死锁或崩溃,因为 mcfork
创建的子进程可能无法访问父进程中锁定的资源,或者可能会看到全局数据的版本不一致(mcfork
运行系统调用 fork
而没有 exec
)。
如果有疑问,使用非 FORK 集群会更安全(请参阅makeCluster
、clusterApply
)。
警告
这是一个非常低级的 API,仅供专家使用。
例子
## This will work when run as an example, but not when pasted in.
p <- parallel:::mcfork()
if (inherits(p, "masterProcess")) {
cat("I'm a child! ", Sys.getpid(), "\n")
parallel:::mcexit(,"I was a child")
}
cat("I'm the master\n")
unserialize(parallel:::readChildren(1.5))
作者
Simon Urbanek and R Core.
Derived from the multicore
package formerly on CRAN.
也可以看看
相关用法
- R mcparallel 在单独的进程中异步计算 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大神的英文原创作品 Fork a Copy of the Current R Process。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。