【问题标题】:Redis Queue: How to prevent chained Jobs from running asynchronouslyRedis Queue:如何防止链式作业异步运行
【发布时间】:2019-10-19 00:51:35
【问题描述】:

我正在尝试让 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 工作人员将此视为错误:

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

j2 不是等待 j1 的结果,而是异步也启动了,因为到那时 j1 的结果还没有准备好,j1.result 是传递给 j2 的 None。我的方法有什么问题?为什么作业不是按顺序运行的?

【问题讨论】:

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


    【解决方案1】:

    当您将作业添加到队列中时,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2011-09-10
      • 1970-01-01
      • 2020-01-16
      • 2021-02-08
      • 1970-01-01
      相关资源
      最近更新 更多