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


R mcparallel 在單獨的進程中異步計算 R 表達式

R語言 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 元素,請參閱 mcfork 了解不建議將 mcparallel 與 GUI front-ends 和多線程庫一起使用)。原始向量保留供內部使用,無法返回,但表達式可以計算,例如到包含原始向量的列表。 NULL 不應返回,因為 mccollect 使用它來發出錯誤信號。

name

可以與作業關聯的可選名稱(長度為 1 的字符向量)。

mc.set.seed

邏輯:參見“隨機數”部分。

silent

如果設置為 TRUE 則 stdout 上的所有輸出都將被抑製(stderr 不受影響)。

mc.affinity

指定 CPU 的數值向量以將子進程限製為(從 1 開始)或 NULL 以不修改 CPU 關聯性

mc.interactive

邏輯上,如果TRUEFALSE則子進程將分別設置為交互式或非交互式。如果NA,則子進程將從父進程繼承交互標誌。

detached

邏輯上,如果 TRUE 則作業與當前會話分離,並且無法返回任何結果 - 它僅用於代碼副作用。

jobs

要收集結果的作業(或單個作業)列表。或者jobs也可以是進程ID的整數向量。如果省略 collect 將等待所有當前存在的子項。

wait

如果設置為FALSE,它將檢查從現在起timeout秒內可用的任何結果,否則它將等待所有指定的作業完成。

timeout

檢查作業結果的超時(以秒為單位) - 僅在 waitFALSE 時適用。

intermediate

FALSEcollect 等待結果時將調用的函數。該函數將使用一個參數來調用,該參數是迄今為止收到的結果列表。

細節

mcparallel評估expr與電流並行的表達式R過程。並行進程和當前進程之間的所有內容都是隻讀共享的(或者實際上copy-on-write),即表達式的side-effects不會影響主進程。可以使用以下方式收集並行執行的結果mccollect函數。

mccollect 函數從並行作業(或實際上任何子進程)收集任何可用結果。如果 waitTRUE,則 collect 將等待所有指定作業完成,然後返回包含每個作業的最後報告結果的列表。如果waitFALSE,則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).

也可以看看

pvec , mclapply

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Evaluate an R Expression Asynchronously in a Separate Process。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。