【问题标题】:Can two celery applications be interdependent? or two tasks of one application be interdependent?两个芹菜应用程序可以相互依赖吗?还是一个应用程序的两个任务相互依赖?
【发布时间】:2014-10-11 05:24:09
【问题描述】:

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

步骤1.一个大文件被分成多个部分(比如说4个),并放入MQ,

第 2 步。一些工作人员(比如说 2)将处理这些文件并存储在某处。

现在,我的问题是,我有另一个任务要完成,那就是加入那些文件,这当然是一个同步任务,即文件的所有部分都应该已经处理,那么,我应该通过 CELERY 做什么加入任务取决于步骤 2。

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

或将文件连接作为 MQ 中的任务,这再次可以(阻塞等待)确保所有部分都已处理,然后连接文件,(这同样可以由任何工作人员完成)

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

【问题讨论】:

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


    【解决方案1】:

    是的,两个 celery 应用程序/任务可以相互依赖。

    为了实现你的目标,我会使用 celery 画布: 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 任务。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 2016-01-09
      • 2021-09-19
      • 1970-01-01
      • 2017-07-15
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多