2017-02-05 27 views
2

私は並列に関数を実行しています。仕事の状態に関する進捗状況の更新を得るために、私は1人だけですが、その進捗状況について定期的に報告することを希望します。これを行う方法についての私の自然な考えは、ワーカーが実行する機能をワーカーの名前を確認し、その名前が特定の値と一致する場合にのみステータス更新を与えることです。しかし、私はこれを事前に決定する信頼できる方法を見つけることができません。たとえばジュリアでは、労働者のID(1,2など)を与える単純なmyid()関数があります。私はRで何か同等のものを探しています。今まで私が見つけた最高のものは、各労働者にSys.getpid()と電話することです。しかし、私はスクリプトを書くための信頼できる方法を知らないので、従業員に割り当てられているpidのどれが事前にわかるでしょう。R - 並列実行時に作業者名を取得する

library(parallel) 

Test_Fun = function(a){ 
    for (idx in 1:10){ 
     Sys.sleep(1) 
     if (myid() == 1){ 
      print(idx) 
     } 
    } 
} 

mclapply(1:4, Test_Fun, mc.cores = 4) 

答えて

1

parallelパッケージには、作業者ID機能を提供していない:私はRのmyid()機能と同等を探しています例外を除いて、以下のようなルックスを書くために探している基本的な機能のスクリプトR 3.3.2のとおり。また、作業を開始する前に作業者を初期化するための仕組みはありません。

mcmapply関数を使用して、追加のタスクID引数をワーカー関数に渡すことをお勧めします。タスクの数がワーカーの数と等しい場合、タスクIDはワーカーIDとして使用できます。例:

library(parallel) 
Test_Fun = function(a, taskid){ 
    for (idx in 1:10){ 
     Sys.sleep(1) 
     if (taskid == 1){ 
      print(idx) 
     } 
    } 
} 
mcmapply(Test_Fun, 1:4, 1:4, mc.cores = 4) 

しかし、作業者よりも多くのタスクがある場合は、最初のタスクの進捗メッセージしか表示されません。これはmc.prescheduleがデフォルトである、TRUEであることを前提としていることを

WORKERID <- NA # indicates worker is uninitialized 
Test_Fun = function(a, taskid){ 
    if (is.na(WORKERID)) WORKERID <<- taskid 
    for (idx in 1:10){ 
     Sys.sleep(1) 
     if (WORKERID == 1){ 
      print(idx) 
     } 
    } 
} 
cores <- 4 
mcmapply(Test_Fun, 1:8, 1:cores, mc.cores = cores) 

注:彼らは彼らの最初のタスクを実行するときには、労働者のそれぞれを初期化することにより、その回避することができます。 mc.prescheduleFALSEであり、タスクの数がワーカーの数より多い場合、各タスクは異なるワーカープロセスによって実行され、ワー​​カーはすべて同時に実行されないため、状況ははるかに動的です。

関連する問題