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


R mcfork 分叉当前 R 进程的副本


R语言 mcfork 位于 parallel 包(package)。

说明

这些是低级函数,在 Windows 上不可用,并且不从命名空间导出。

mcfork创建一个新的子进程作为当前进程的副本R过程。

mcexit 关闭当前子进程,并根据需要通知主进程。

用法

mcfork(estranged = FALSE)

mcexit(exit.code = 0L, send = NULL)

参数

estranged

逻辑上,如果TRUE则新进程与父进程没有联系,不会显示在子进程列表中,并且不会在退出时被杀死。

exit.code

进程退出代码。按照惯例,0L 表示干净退出,1L 表示错误。

send

如果不是 NULL 在退出之前发送此数据(相当于使用 sendMaster )。

细节

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 以及依赖它的高级函数(例如 mcparallelmclapplypvec ),因为这会导致多个进程共享同一 GUI这可能会导致混乱(甚至可能崩溃)。子进程永远不应该使用屏幕上的图形设备。已采取一些预防措施使其可在 macOS 上的 R.app 中使用,但第三方 front-ends 的用户应查阅其文档。

这也可以应用于分叉之前创建的其他连接(例如,到 X 服务器),以及由例如打开的文件。图形设备。

请注意,tcltk 算作用于这些目的的 GUI,因为 Tcl 运行事件循环。该事件循环在子进程中被禁止,但 Tk 图形连接仍然可能存在问题。

强烈建议不要在任何多线程 R 进程(带有由第三方库或包创建的附加线程)中使用 mcfork 和更高级别的函数。这种使用可能会导致死锁或崩溃,因为 mcfork 创建的子进程可能无法访问父进程中锁定的资源,或者可能会看到全局数据的版本不一致(mcfork 运行系统调用 fork 而没有 exec )。

如果有疑问,使用非 FORK 集群会更安全(请参阅makeClusterclusterApply)。

警告

这是一个非常低级的 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.

也可以看看

mcparallel , sendMaster

相关用法


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