Python/rq - 监视工作者状态

use*_*609 6 python task-queue

如果这是一个愚蠢的问题,我道歉并将羞辱我的头,但是:

我正在使用rq在Python中排队作业.我希望它像这样工作:

  1. 工作A开始.作业A通过Web API抓取数据并存储它.
  2. 工作A运行.
  3. 工作A完成.
  4. 完成A后,作业B开始.作业B检查作业A存储的每个记录,并添加一些其他响应数据.
  5. 完成作业B后,用户会收到一封快乐的电子邮件,说明他们的报告准备就绪.

我的代码到目前为止:

redis_conn = Redis()
use_connection(redis_conn)
q = Queue('normal', connection=redis_conn) # this is terrible, I know - fixing later
w = Worker(q)
job = q.enqueue(getlinksmod.lsGet, theURL,total,domainid)
w.work()
Run Code Online (Sandbox Code Playgroud)

我认为我最好的解决方案是拥有2名工人,一名为工作A,一名为B工作.工作B工人可以监督工作A,当工作A完成时,开始工作B.

我无法想象拯救我的生命是我如何让一个工人监视另一个人的状态.我可以通过job.id从作业A中获取作业ID.我可以使用w.name获取工作者名称.但对于我如何将任何信息传递给其他工作人员并不是最模糊的.

或者,有一个更简单的方法来做到这一点,我完全失踪了?

小智 7

更新januari 2015,此拉取请求现已合并,参数重命名为depends_on,即:

second_job = q.enqueue(email_customer, depends_on=first_job)
Run Code Online (Sandbox Code Playgroud)

对于运行较旧版本的人来说原始帖子完好无损,例如:

我已经提交了拉取请求(https://github.com/nvie/rq/pull/207)来处理RQ中的作业依赖性.当此拉取请求合并后,您将能够:

def generate_report():
    pass

def email_customer():
    pass

first_job = q.enqueue(generate_report)
second_job = q.enqueue(email_customer, after=first_job)
# In the second enqueue call, job is created,
# but only moved into queue after first_job finishes
Run Code Online (Sandbox Code Playgroud)

现在,我建议编写一个包装函数来顺序运行你的工作.例如:

def generate_report():
     pass

def email_customer():
    pass

def generate_report_and_email():
    generate_report()
    email_customer() # You can also enqueue this function, if you really want to

# Somewhere else
q.enqueue(generate_report_and_email)
Run Code Online (Sandbox Code Playgroud)


Nat*_*han 1

您可能对项目太深入而无法切换,但如果不是,请查看Twisted. http://twistedmatrix.com/trac/我现在正在将它用于一个访问 API、抓取 Web 内容等的项目。它并行运行多个作业,并按顺序组织某些作业,因此作业 B 不会t 执行直到作业 A 完成。

如果您想尝试的话,这是学习 Twisted 的最佳教程。http://krondo.com/?page_id=1327