R語言-多線程并行化任務(wù)計算(分發(fā)計算任務(wù)到多個cpu內(nèi)核)


R語言運行在CPU單核單線程上,提高計算效率可以通過并行包:parallel實現(xiàn),該包屬于base包,不需要額外安裝。
parallel::mclapply函數(shù)是 lapply 的并發(fā)版本,可以自定義進程數(shù)發(fā)揮多CPU核心的優(yōu)勢?!癿c”代表“多核”,此函數(shù)將 lapply 任務(wù)分配到多個 CPU 內(nèi)核創(chuàng)建多線程的形式并發(fā)執(zhí)行。
線程作為進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,線程的優(yōu)勢是提高應(yīng)用程序響應(yīng);使多CPU系統(tǒng)更加有效。操作系統(tǒng)會保證當(dāng)線程數(shù)不大于CPU數(shù)目時,不同的線程運行于不同的CPU上。

step.1創(chuàng)建任務(wù)環(huán)境各種變量

{
    library(Seurat);library(dplyr);set.seed(123)
    infiles <- dir(path = ".",pattern = "*_raw.rds", full.names = TRUE,recursive = T)
    scRNAlist <- lapply(infiles, readRDS)            #創(chuàng)建數(shù)據(jù)集list,用于并行運算,本次測試的scRNAlist包含5個數(shù)據(jù)對象
    rank_i <- bigmemory::big.matrix(1,1,init = 0)    #創(chuàng)建共享內(nèi)存變量,該變量可被所有線程修改,本測試用此變量統(tǒng)計任務(wù)完成順序
    m <- synchronicity::boost.mutex()                #創(chuàng)建互斥鎖,防止共享內(nèi)存變量被多個線程同時修改引發(fā)異常
}

step.2并行運算任務(wù)基于parallel::mclapply函數(shù),通過mc.cores = 3設(shè)置同時并發(fā)的任務(wù)數(shù)

parallel::mclapply(scRNAlist,function(e) {#并行迭代數(shù)據(jù)集list,每次迭代將數(shù)據(jù)集的元素傳遞給變量 e

    print(paste0(Sys.time(),"    ",unique(e$orig.ident)," processing>>>")) #任務(wù)提交信息
    {
        suppressWarnings({ #對每個數(shù)據(jù)集進行降維運算
            EC <- e %>% NormalizeData(verbose = F) %>% FindVariableFeatures(verbose = F) %>% ScaleData(verbose = F) %>% RunPCA(verbose = F)
        })
        
        synchronicity::lock(m) #進程鎖;運行時有且只能有一個運算對共享內(nèi)存變量進行修改,防止進程間同時修改變量引發(fā)異常
        rank_i[1] = rank_i[1] + 1 ; #對計序變量進行累加(統(tǒng)計任務(wù)完成的順序)
        synchronicity::unlock(m)#解鎖,共享內(nèi)存變量可被修改
    }
    print(paste0(Sys.time(),"    ",unique(e$orig.ident)," done!","____________",rank_i[1])) #任務(wù)完成提示信息+任務(wù)完成順序

}, mc.cores = 3,mc.preschedule = FALSE) -> tmp ; rm(tmp)


#從任務(wù)輸出提示信息可以看到,并行循環(huán)開始一次性提交了3個任務(wù)(3并發(fā)),當(dāng)一個任務(wù)完成后,會迅速提交隊列的其它任務(wù)進行運算飽和計算資源。
#最先提交的A-2-work任務(wù)由于數(shù)據(jù)集最小,最先完成,而最先提交的 A-4-work任務(wù)數(shù)據(jù)集較大,是第三個完成的。
[1] "2022-05-19 20:12:26    A-2-work processing>>>"
[1] "2022-05-19 20:12:26    A-3-work processing>>>"
[1] "2022-05-19 20:12:27    A-4-work processing>>>"
[1] "2022-05-19 20:12:29    A-2-work done!____________1"
[1] "2022-05-19 20:12:29    B-1-work processing>>>"
[1] "2022-05-19 20:12:45    B-1-work done!____________2"
[1] "2022-05-19 20:12:46    B-2-work processing>>>"
[1] "2022-05-19 20:13:00    A-4-work done!____________3"
[1] "2022-05-19 20:13:01    B-3-work processing>>>"
[1] "2022-05-19 20:13:04    A-3-work done!____________4"
[1] "2022-05-19 20:13:08    B-2-work done!____________5"
[1] "2022-05-19 20:13:12    B-3-work done!____________6"

當(dāng)只有一個R主進程時的任務(wù)后臺

htop任務(wù)后臺

R主進程提交多任務(wù)并行后創(chuàng)建的3個子線程

htop任務(wù)后臺
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容