两种芹菜应用可以相互依赖吗?或者一个应用程序的两个任务是相互依赖的?

时间:2014-08-18 10:14:23

标签: python rabbitmq celery message-queue distributed-computing

我的工作流程如下,我正在使用带有rabbitMQ的Celery

步骤1.将大文件分成多个部分(让我们说4),然后放入MQ,

第2步。一些工人(让他们说2)将处理这些文件并存储在某个地方。

现在,我的问题是,我还有另外一个任务需要完成,那就是加入那些文件,其中一个是同步任务,即文件的所有部分都应该被处理掉了,所以,我该怎样做才能通过CELERY来制作加入任务取决于第2步。

我是否创建了一个单独的应用程序来连接文件,这些文件可以以某种方式接收这些工作人员的状态,无论他们是否已经完成处理这些文件。

或将文件连接作为MQ中的任务,再次可以(阻止等待)确保所有部件都被处理,然后加入文件,(这也可以由任何工人完成)

哪种方法可以实现? 使这两项任务相互依存

1 个答案:

答案 0 :(得分:1)

是的,两个芹菜应用/任务可以相互依赖。

为了实现你的目标,我会使用芹菜画布: http://celery.readthedocs.org/en/latest/userguide/canvas.html 更精确的和弦'

  

和弦是仅在组中的所有任务完成后执行的任务   执行。

from celery import chord

@task
def process_parts(part):
    pass

@task
def join_parts(parts)
    pass

def split_file(f)
    return file_parts_array

def process_file(f):
    process_parts = [process_part.s(x) for x in split_file(f)]
    join_parts = join_files.s()
    result = chord(process_parts)(join_parts)
    return result

您将任务join_parts映射到特定队列,因此只有存储计算机上的工作人员使用join_files任务。