2013-03-17 51 views
2

我有一个生成通过Python的itertools产品大名单的程序;基本上是一组大量的单词组合。有多个集合可以运行products()函数。我想要做的是让Celery帮忙,把每一套芹菜任务分配给不同的芹菜任务,最后把它们结合起来。我的理解是和弦是做到这一点的方法。Django的芹菜和弦不予执行

所以基本上我有这样的:

callback = tabulate_results.subtask() 
header = [] 
for combo in combos_to_run: 
    header.append(run_product.subtask(args=(object_terms, combo))) 
result = chord(header)(callback) 
result.get() 

和它的两个配套,简装功能:

from celery import subtask, chord 
@task() 
def run_product(object_list, combo_set): 
    results = [] 
    for result in product(object_list, *combo_set): 
     results.append(result) 
    return results 

@task() 
def tabulate_results(result_sets): 
    master_set = [] 
    for result_set in result_sets: 
     master_set.extend(result_set) 

    return master_set 

起初,和弦任务没有显示在celeryev,但我有一个这里的问题引用:Django Celery - Missing something but I have no idea what? Have results but can't get them约芹​​菜返回具有结果通过MySQL的跟踪做了一个错误。我的确在使用MySQL作为我的结果后端,并将其切换到Redis中。但是,现在我有一个新问题。当我通过代码通过Django的shell中运行,没有任务出现在celeryev,并没有返回超出了:

R IS: <GroupResult: 9f658e8d-591f-4fa9-9e79-4db0c51e8331 [9b199d1e-061f-413c-9521-4a3051dd121a, 2effbfb5-c9dc-4569-a63f-656c233a9387, 80911a60-6a22-46bb-83a1-d5a84c659794, 70acfa43-8ffe-4bc8-8ff1-1df6def035e1, dd417423-d1f6-44eb-8c4b-2ded40d7614f, fbff8adc-815d-459c-b914-b30528dbbd39]> 

基本上是一个芹菜的消息,但没有数据。该代码也永远不会返回,并且我的光标悬挂。当我控制-C输出时,行号在Celery中似乎正在等待。尽管celeryev没有给我任何任务,但我不知道该怎么做。我已确认其他任务在celeryev中显示。

我通常测试我的功能,而无需运行它们如芹菜任务,他们正常返回。

短版 我试图让芹菜和弦,以帮助在我的Django应用程序的密集Python的任务,但他们似乎并没有被返回任何结果,或者得到进入celeryev。 Redis后端。芹菜版本3.0.15。 Django 1.4。

+0

您是否尝试过的时间限制为标题的任务,并定义[错误处理](http://docs.celeryproject.org/en/latest/userguide/canvas.html#error-handling)? – guival 2016-08-23 12:12:59

回答

1

首先,它通常被认为是不好的做法,对他人的结果一个任务等待(这就是为什么要用过链子任务) - source

除此之外,在贴上的语法你的和弦不正确。以下是相关链接:http://docs.celeryproject.org/en/master/getting-started/next-steps.html#chords。在其他问题中,您的代码不会将任何任务传递给和弦。和弦只是一组作为一个组被处理的任务,然后回调被触发。从文档,这里是一个和弦的正确语法:

>>> from celery import chord 
>>> from proj.tasks import add, xsum 

>>> chord((add.s(i, i) for i in xrange(10)), xsum.s())().get() 
90 

注意,和弦有两个参数,该组的初始任务,一方面是和回调(用逗号分隔),在其他。

这是一个开始,但它听起来像花更多的时间与文档将帮助你比什么都重要。

+0

如果你看看这个[例](http://docs.celeryproject.org/en/latest/userguide/canvas.html#chords)虽然,格式相匹配。 – guival 2016-08-23 12:10:43