是否可以手动将任务添加到redis队列中,以便它可以由redis worker执行?
作为一个简单的例子,我正在使用以下方法启动一个工人:
require('doRedis')
redisWorker('jobs')
在另一个 R 会话中,我正在创建一个队列,并希望将一个简单的表达式(例如:)发送print("hello world")
到队列,以便它由工作人员执行。
我知道如何使用foreach
:
require('doRedis')
registerDoRedis('jobs')
foreach(j=1,.combine=sum,.multicombine=TRUE) %dopar% {
print("hello world")
1
}
我希望能够在不使用 foreach 的情况下将任务添加到队列中。原因是,我不想让我的 R 会话等待输出(脚本会将其结果写入磁盘)。
根据函数中的代码,这是我迄今为止所尝试的.doRedis()
:
data <- list(queue = "jobs")
queue <- data$queue
queueCounter <- sprintf("%s:counter", queue) # job task ID counter
ID <- redisIncr(queueCounter)
queueEnv <- sprintf("%s:%.0f.env",queue,ID) # R job environment
queueTasks <- sprintf("%s:%.0f",queue,ID) # Job tasks hash
queueResults <- sprintf("%s:%.0f.results",queue,ID) # Output values
queueStart <- sprintf("%s:%.0f.start*",queue,ID)
queueAlive <- sprintf("%s:%.0f.alive*",queue,ID)
# add the environment to the queue
redisSet(key = queueEnv,
value = list(expr=expression(),
exportenv=baseenv(),
packages=NULL)
# put tasks in queue
taskblock <- list(ex1 <- expression('print("hello world")'))
j <- 1
taskLabel <- I
task_id = as.character(taskLabel(j))
task <- list(task_id=task_id, args=taskblock)
redisHSet(key = queueTasks,
field = task_id,
value = task)
redisRPush(key = queue, value = ID)
它不起作用,我认为(至少)环境的定义是错误的......
非常欢迎任何帮助!