我想在celery chain命令中使用块。
chain = task1.s(arg1) | task2.chunks(?,CHUNK_SIZE) | task3.chunks(?, CHUNK_SIZE)
基本上我想要做的是运行task1,将其结果块并发送到task2,然后应该调用task3,task3也应该从task2接收chunked结果来完成该过程。为什么?因为task1和task2都可以返回相当数量的项目,我想更多批处理。
上面的代码不起作用,因为我不太确定要放置什么而不是问号以使其工作。
我不太确定这甚至是可能的,因为搜索没有提供太多结果,因此在不可能构建这样的工作流程的情况下,我会对合理的替代方案感兴趣。
答案 0 :(得分:2)
我不确定现有的原语是否可以实现这一点。
我可以考虑两种替代方案/解决办法:
使用数据块/和弦从任务中启动新任务。
你一定已经想过这个了。我们的想法是使用apply_async
正常调用task1。完成该任务后,生成需要分块的大量输出,只需使用chunks原语进一步为task2创建块。同样,为task2和task3之间的转换执行相同的步骤。当你最终等待获取内部任务的结果时,从任务中调用任务只是一个坏主意。所以请记住,如果您正在等待任务结果,那么这不是推荐的方法。
@task
def task1(some_input):
# Do stuff
# Create a list of lists where the inner list represent the *args to send to an individual task
task2.chunks([[i, j], [i, j], [i, j]], CHUNK_SIZE).apply_async()
@task
def task2(a, b):
# Do stuff
# Create a list of lists where the inner list represent the *args to send to an individual task
task3.chunks([[i, j], [i, j], [i, j]], CHUNK_SIZE).apply_async()
@task
def task3(a, b):
# Do stuff
这个解决方案有点有趣。我在芹菜Github问题页面上遇到了一个特殊的请求。查看来自steeve的此拉取请求:https://github.com/celery/celery/pull/817 根据我的理解,他创建了一个动态任务装饰器(关于名称是否应该是这个的辩论),它可以理解任务是否返回子任务。如果是这样,它首先应用该子任务。他声称他正在Veezio成功使用它。我自己还没试过。我建议前往那个主题并提出几个问题。或者甚至在Twitter或IRC或其它什么地方讨论过Steeve。