問題:我需要控制執行順序,在這個順序中任務由foreach循環並行處理。不幸的是,這不被foreach支持。R - doRedis - 覆蓋getTask來控制並行foreach循環中的執行順序
解決方法記住:使用doRedis使用數據庫來保存所有在foreach循環中執行的任務。爲了控制順序,我想通過setGetTask覆蓋getTask來獲取基於預先指定順序的任務。雖然我找不到有關如何做到這一點的文檔。
其它信息:
有上setGetTask小段落與所述redis documentation一個例子。
getTask <- function (queue , job_id , ...) { key <- sprintf(" redisEval("local x=redis.call('hkeys',KEYS[1])[1]; if x==nil then return nil end; local ans=redis.call('hget',KEYS[1],x); redis.call('hdel',KEYS[1],x);i return ans",key) } setGetTask(getTask)
我雖然覺得文檔中的代碼在語法上是不正確的(缺少恕我直言,一個「和右括號‘)’)。我認爲這是不可能的CRAN,作爲執行對文檔的代碼在提交。
改變getTask功能的工人越來越任務(的方面不會改變任何東西,即使引入明顯的非感到redisEval喜歡它更改爲redisEval(「DDDDDDDDDD(((」)
從sourc安裝包後,我只能訪問setGetTask函數E(這是我從official CRAN package page of version 1.1.1下載(這恕我直言,應該不是直接從CRAN安裝它沒有區別)
數據:任務執行的數據框看起來如下:
taskName;taskQueuePosition;parameter1;paramterN
taskT;1;val1;10
taskK;2;val2;8
taskP;3;val3;7
taskA;4;val4;7
我想用'taskQueuePosition'來控制順序,應該先執行數字較小的任務。
問題:
- 是否有人知道的任何資源在那裏我可以得到與doRedis或setGetTask這樣做的更多信息?
- 有誰知道我需要如何改變getTask來實現上述?
- 任何其他聰明的想法來控制foreach循環中的執行順序?優選地,使得在某些時候,我可以使用doRedis作爲並行後端(由於複雜的技術基礎設施原因,改變這將意味着處理中的重大改變)。
代碼(爲了便於重現):
以下假定Redis的服務器開始在本地機器上。
Redis的DB灌裝:
library(doRedis)
library(foreach)
options('redis:num'=TRUE) # needed for proper execution
REDIS_JOB_QUEUE = "jobs"
registerDoRedis(REDIS_JOB_QUEUE)
# filling up the data frame
taskDF = data.frame(taskName=c("taskT","taskK","taskP","taskA"),
taskQueuePosition=c(1,2,3,4),
parameter1=c("val1","val2","val3","val4"),
parameterN=c(10,8,7,7))
foreach(currTask=iter(taskDF, by='row'),
.verbose = T
) %dopar% {
print(paste("Executing task: ",currTask$taskName))
Sys.sleep(currTask$parameterN)
}
removeQueue(REDIS_JOB_QUEUE)
工人:
library(doRedis)
REDIS_JOB_QUEUE = "jobs"
startLocalWorkers(n=1, queue=REDIS_JOB_QUEUE)