當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。