如果这是一个愚蠢的问题,我道歉并将羞辱我的头,但是:
我正在使用rq在Python中排队作业。我希望它能像这样工作:
到目前为止我的代码:
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获取工作者名称。但对于我如何将任何信息传递给其他工作人员并不是最模糊的。
或者,是否有一种更为简单的方法可以让我完全失踪?
答案 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)
您可能太深入了解项目,但如果没有,请查看Twisted
。 http://twistedmatrix.com/trac/我现在正在使用它来攻击API,抓取网页内容等项目。它并行运行多个作业,以及按顺序组织某些作业,因此作业B直到作业A才会执行已经完成了。
如果您想尝试,这是学习Twisted的最佳教程。 http://krondo.com/?page_id=1327