Python / rq - 监视工作者状态

时间:2012-08-23 21:38:27

标签: python task-queue

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

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

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

    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()
    

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

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

    或者,是否有一种更为简单的方法可以让我完全失踪?

4 个答案:

答案 0 :(得分:7)

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

second_job = q.enqueue(email_customer, depends_on=first_job)

对于运行较旧版本的用户而言,原始帖子完好无损:

我已提交拉取请求(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

目前,我建议编写一个包装函数来顺序运行你的作业。例如:

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)

答案 1 :(得分:2)

来自rq文档的this page,看起来每个job对象都有result属性,可以job.result调用,您可以查看。如果作业还没有完成,它将是None,但是如果你确保你的工作返回一些价值(即使只是"Done"),那么你可以让你的另一个工作人员检查结果第一份工作,然后只有在job.result有值时才开始工作,这意味着第一个工人已完成。

答案 2 :(得分:0)

将作业A和作业B所做的事情组合在一个功能中,然后使用例如multiprocessing.Pool(它是map_async方法)将其分配到不同的进程中。

我不熟悉rq,但multiprocessing是标准库的一部分。默认情况下,它使用与CPU有核心一样多的进程,根据我的经验,这通常足以使机器饱和。

答案 3 :(得分:0)

您可能太深入了解项目,但如果没有,请查看Twistedhttp://twistedmatrix.com/trac/我现在正在使用它来攻击API,抓取网页内容等项目。它并行运行多个作业,以及按顺序组织某些作业,因此作业B直到作业A才会执行已经完成了。

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