Redis队列:如何防止链接的作业异步运行

时间:2019-06-03 12:53:46

标签: python-3.x redis queue python-rq

我试图按顺序依次执行3个Jobs:

Job1 -> Job2 -> Job3

这3个作业在operations.py中定义:

def Job1(x):
    return x

def Job2(x):
    return x * x

def Job3(x):
    print(x)

我正在script.py运行时在rq worker中调用这些作业:

from redis import Redis
from rq import Queue
from operation import Job1, Job2, Job3

redis_conn = Redis()
q = Queue(connection=redis_conn)

for num in [1,2,3,4,5,6,7,8]:
    j1 = q.enqueue(Job1, num)
    j2 = q.enqueue(Job2, j1.result, depends_on = j1)
    j3 = q.enqueue(Job3, depends_on = j2)

根据documentation,我希望j3等待j2,这反过来又应该等待j1完成执行。但是,这可能不会发生。作业似乎正在异步运行。我之所以这样说,是因为redis工作者给出了这样的错误:

File "./operation.py", line 5, in Job2
    return x * x
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

j2而不是等待j1的结果也会触发异步,并且因为此时j1的结果还没有准备好,所以j1.result为None,它将传递给j2。我的方法有什么问题?为什么不按顺序运行作业?

1 个答案:

答案 0 :(得分:0)

将作业添加到队列时,j1.resultNone:只有当工作人员完成执行后,它的值才会不同。

我认为您需要将j1.id传递给Job2,并执行类似的操作

def Job2(job1_id):
  from rq.job import Job
  job1 = Job.fetch(job1_id)
  x = job1.result
  return x * x

更多信息,http://python-rq.org/docs/jobs/#retrieving-a-job-from-redis

编辑: 这样做更干净,而无需传递id https://stackoverflow.com/a/37713756/239408