Задача: Мне нужно контролировать порядок выполнения, в котором задачи обрабатываются параллельно циклом foreach. К сожалению, это не поддерживается foreach.R - doRedis - перезаписать getTask для управления порядком выполнения в параллельных петлях foreach
Решение: Использование doRedis для использования базы данных для хранения всех задач, выполняемых в цикле foreach. Чтобы контролировать порядок, я хочу переписать getTask с помощью setGetTask, чтобы получить задания на основе заранее заданного порядка. Хотя я не мог найти много документации о том, как это сделать.
Дополнительная информация:
Существует небольшой абзац на 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 (((»)
У меня был доступ к функции setGetTask после установки пакета из sourc е (который я скачал с official CRAN package page of version 1.1.1 (что имхо не должно иметь никакого значения, чем устанавливать его непосредственно из CRAN)
данных: Dataframe задач для выполнения выглядит следующим образом:
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)