Python 2.7 需要在所有其他任务完成后启动芹菜任务

Python 2.7 需要在所有其他任务完成后启动芹菜任务,python-2.7,celery,Python 2.7,Celery,我对芹菜比较陌生。我有一个要求,我的一个芹菜任务应该在所有其他任务完成后才开始。我确实玩过它,还在网上找到了一些文档,其中指出我应该使用组和和弦等,我无法完全理解 我还发布了另一个问题,但到目前为止还没有找到任何令人信服的答案 最后我发现,我可以清楚地(至少在概念上)理解被接受的答案中发生了什么。但是,当我尝试在我的终端复制完全相同的程序时,它抛出了以下错误: EncodeError:JSON不可序列化 我在上面的问题中也发表了同样的评论,这个问题似乎很老了,因此到目前为止,我的评论还没有得到任

我对芹菜比较陌生。我有一个要求,我的一个芹菜任务应该在所有其他任务完成后才开始。我确实玩过它,还在网上找到了一些文档,其中指出我应该使用
和弦
等,我无法完全理解

我还发布了另一个问题,但到目前为止还没有找到任何令人信服的答案

最后我发现,我可以清楚地(至少在概念上)理解被接受的答案中发生了什么。但是,当我尝试在我的终端复制完全相同的程序时,它抛出了以下错误:

EncodeError:JSON不可序列化

我在上面的问题中也发表了同样的评论,这个问题似乎很老了,因此到目前为止,我的评论还没有得到任何关注

有人能帮忙吗?

如果

您已经有了一个任务列表,这些任务必须一个接一个地执行,并且只希望合并您必须使用的结果

否则

如果您一直向芹菜中添加任务(不是立即添加),并且希望一个接一个地执行这些任务,那么只需设置1个并发性为1的worker,就可以实现这一点,任务只能一个接一个地执行

我以前也遇到过并行执行问题,一开始我通过运行一个并发度为1的worker解决了这个问题,但后来我使用redis锁定机制来实现解决方案。

中的公认答案实际上帮助我实现了我想要的。(也许这是一种很有技巧的方法,但它解决了我的问题)。但是,答案抛出了一个错误,如下所示:

EncodeError:JSON不可序列化

以下是我能够解决的问题(我在对答案的评论中也提到了这一变化)

因此在用例中,答案中的部分:

tasks = []
for i in xrange(10):
    tasks.append(power.delay(i, 2))

amass.delay([], tasks)
作为
amass.delay()
的第二个参数,我们将传递一个任务对象列表。我只是将其改为实际传递任务ID列表。因此,
amass()
现在看起来像:

tasks = []
for i in xrange(10):
    x = power.delay(i, 2)
    tasks.append(x.id)

amass.delay([], tasks)
并在
amass()
中进行了相应的更改,如下所示 它解决了错误,完成了我想要完成的工作

@celery.task()
def amass(results, tasks):
    completed_tasks = []
    for task_id in tasks:
        result = AsyncResult(task_id, app=celery)
        if result.ready():
            completed_tasks.append(task_id)
            #results.append(task.get()) did not need this so commented it out

    # remove completed tasks
    tasks = list(set(tasks) - set(completed_tasks))

    if len(tasks) > 0:
        # resend the task to execute at least 1 second from now
        amass.delay(results, tasks, countdown=1)
    else:
        # we done
        print results
看一看。重新发布不是正确的做法。