mcparallel
位於 parallel
包(package)。 說明
這些函數基於分叉,因此在 Windows 上不可用。
mcparallel
開始並行R計算給定表達式的過程。
mccollect
從一個或多個並行進程收集結果。
用法
mcparallel(expr, name, mc.set.seed = TRUE, silent = FALSE,
mc.affinity = NULL, mc.interactive = FALSE,
detached = FALSE)
mccollect(jobs, wait = TRUE, timeout = 0, intermediate = FALSE)
參數
expr |
要計算的表達式(請勿在此代碼中使用任何屏幕設備或 GUI 元素,請參閱 |
name |
可以與作業關聯的可選名稱(長度為 1 的字符向量)。 |
mc.set.seed |
邏輯:參見“隨機數”部分。 |
silent |
如果設置為 |
mc.affinity |
指定 CPU 的數值向量以將子進程限製為(從 1 開始)或 |
mc.interactive |
邏輯上,如果 |
detached |
邏輯上,如果 |
jobs |
要收集結果的作業(或單個作業)列表。或者 |
wait |
如果設置為 |
timeout |
檢查作業結果的超時(以秒為單位) - 僅在 |
intermediate |
|
細節
mcparallel
評估expr
與電流並行的表達式R過程。並行進程和當前進程之間的所有內容都是隻讀共享的(或者實際上copy-on-write),即表達式的side-effects不會影響主進程。可以使用以下方式收集並行執行的結果mccollect
函數。
mccollect
函數從並行作業(或實際上任何子進程)收集任何可用結果。如果 wait
是 TRUE
,則 collect
將等待所有指定作業完成,然後返回包含每個作業的最後報告結果的列表。如果wait
是FALSE
,則mccollect
僅檢查當前可用的結果,而不會等待作業完成。如果指定jobs
,則未列出的作業將不會受到影響或執行。
注意:如果 expr
使用低級多核函數,例如 sendMaster
,單個作業可以多次交付結果,用戶有責任正確解釋它們。對於已發送結果且作業不再可用的終止作業,mccollect
將為該作業返回 NULL
。
作業由進程 ID 標識(即使稱為作業對象),操作係統會重複使用這些 ID。因此,mcparallel
創建的分離作業永遠無法通過其進程 ID 或作業對象安全引用。非分離作業保證存在,直到被 mccollect
收集,即使崩潰或被信號終止。一旦被 mccollect
收集,作業就被視為已分離,因此不能再通過其進程 ID 或作業對象來引用。對於 wait = TRUE
,將收集傳遞給 mccollect
的所有作業。對於 wait = FALSE
,收集的作業以結果向量的名稱給出,因此在對 mccollect
的後續調用中必須排除這些作業。隻要 API 接受作業對象,就應優先使用進程 ID。
mc.affinity
參數可用於嘗試將子進程限製到特定的 CPU。此函數的可用性和範圍取決於係統(例如,某些係統將僅考慮 CPU 數量,其他係統將完全忽略它)。
值
mcparallel
返回 "parallelJob"
類的對象,該類繼承自 "childProcess"
(請參閱 mcfork
幫助的“值”部分)。如果提供了參數 name
,這將有一個附加組件 name
。
mccollect
返回列表中可用的任何結果。結果將與指定作業的順序相同。如果有多個作業並且一個作業有一個名稱,它將用於命名結果,否則將使用其進程 ID。如果沒有指定的子進程仍在運行,則返回 NULL
。
隨機數
如果mc.set.seed = FALSE
,子進程具有與當前進程相同的初始隨機數生成器 (RNG) 狀態R會議。如果 RNG 已被使用(或.Random.seed
從保存的工作區恢複),孩子將在與當前會話相同的點開始繪製隨機數。如果尚未使用 RNG,則子進程將在首次使用 RNG 時根據時間和進程 ID 設置種子:這幾乎可以保證提供與當前會話和任何其他子進程不同的隨機數流過程。
僅當選擇了 RNGkind("L'Ecuyer-CMRG")
時,mc.set.seed = TRUE
的行為才會有所不同。然後,每次子進程被分叉時,它都會被賦予下一個流(參見nextRNGStream
)。因此,如果您選擇該生成器,設置種子並在第一次使用 mcparallel
之前調用 mc.reset.stream
,則隻要為第一個、第二個……分叉進程提供相同的任務,模擬結果將是可重現的。
注意
之前R3.4.0 和 32 位平台上,base serialize每個分叉進程的 d 結果僅限於 字節。 (通過序列化返回非常大的結果效率低下,應該避免。)
例子
p <- mcparallel(1:10)
q <- mcparallel(1:20)
# wait for both jobs to finish and collect all results
res <- mccollect(list(p, q))
## IGNORE_RDIFF_BEGIN
## reports process ids, so not reproducible
p <- mcparallel(1:10)
mccollect(p, wait = FALSE, 10) # will retrieve the result (since it's fast)
mccollect(p, wait = FALSE) # will signal the job as terminating
mccollect(p, wait = FALSE) # there is no longer such a job
## IGNORE_RDIFF_END
# a naive parallel lapply can be created using mcparallel alone:
jobs <- lapply(1:10, function(x) mcparallel(rnorm(x), name = x))
mccollect(jobs)
作者
Simon Urbanek and R Core.
Derived from the multicore
package formerly on
CRAN. (but with different handling of the RNG stream).
也可以看看
相關用法
- R mcfork 分叉當前 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大神的英文原創作品 Evaluate an R Expression Asynchronously in a Separate Process。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。