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