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
看一看。重新发布不是正确的做法。