我正在尝试让 3 个作业按顺序依次运行:
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,而 j2 又应该等待 j1 完成执行。但是,这可能不会发生。这些作业似乎正在异步运行。我这么说是因为 Redis Worker 给出了一个错误:
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。我的方法有什么问题吗?为什么作业不按顺序运行?
最佳答案
当您将作业添加到队列时,j1.result
为 None
:只有在工作线程完成执行后,它才会具有不同的值。
我认为您需要将 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
关于python - Redis队列: How to prevent chained Jobs from running asynchronously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427821/