小编ost*_*ler的帖子

如何在 python-rq 中在计划作业和排队作业之间创建“depends_on”关系

我有一个 Web 服务(Python 3.7、Flask 1.0.2),其工作流由 3 个步骤组成:

  • 步骤 1:将远程计算作业提交到商业排队系统(IBM 的 LSF)
  • 第 2 步:每 61 秒轮询一次远程计算作业状态(61 秒因为缓存作业状态结果)
  • 第 3 步:如果第 2 步返回远程计算作业状态 ==“DONE”,则数据后处理

远程计算作业的长度是任意的(在秒和天之间),每一步都依赖于上一步的完成:

with Connection(redis.from_url(current_app.config['REDIS_URL'])):
    q = Queue()
    job1 = q.enqueue(step1)
    job2 = q.enqueue(step2, depends_on=job1)
    job3 = q.enqueue(step3, depends_on=job2)
Run Code Online (Sandbox Code Playgroud)

但是,最终所有工作人员(4 名工作人员)都将进行轮询(4 个客户端请求中的第 2 步),而他们应该继续执行其他传入请求的第 1 步和已成功通过第 2 步的那些工作流的第 3 步。

工人应该在每次投票后被释放。他们应该定期返回第 2 步进行下一次轮询(每个作业最多每 61 秒一次),如果远程计算作业轮询未返回“DONE”,则重新排队轮询作业。


此时我开始使用rq-scheduler(因为间隔和重新排队功能听起来很有希望):

with Connection(redis.from_url(current_app.config['REDIS_URL'])):
    q = Queue()
    s = Scheduler('default')

    job1 = q.enqueue(step1, REQ_ID)

    job2 = Job.create(step2, (REQ_ID,), depends_on=job1)
    job2.meta['interval'] = 61
    job2.origin …
Run Code Online (Sandbox Code Playgroud)

python task-queue redis python-rq

5
推荐指数
1
解决办法
556
查看次数

标签 统计

python ×1

python-rq ×1

redis ×1

task-queue ×1