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