python - Redis队列: How to prevent chained Jobs from running asynchronously

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

我正在尝试让 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.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

关于python - Redis队列: How to prevent chained Jobs from running asynchronously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427821/

相关文章:

python - 运行setup.py后我可以扔掉源代码吗?

python - Pytesseract 没有给出预期的输出

Python 单元测试 - 设置警告 : ResourceWarning

Redis 自愈集群或云、Kubernetes 或 Swarm 中的替代方案?

azure - 无法使用 ServiceStack.Redis 库连接 Redis 缓存服务器

python - 导入 OpenCV 时获取 "ImportError: libXrender.so.1: cannot open shared object file"

python - 处理 __init__ 中的异常

python - 虚拟环境中的 Pip 升级访问被拒绝

node.js - Redis time() 有时会返回 future 的时间

python - 替换用小写字母括起来的字符