Celery:异步检索先前任务的部分结果

时间:2016-03-07 14:32:38

标签: python celery etl

我希望链接我的ETL工作流,从而Load任务可以异步流式传输ExtractTransform任务的部分结果,而无需等待ExtractTransform完成。 Celery有可能吗?

我正在考虑两种方法:

方法1

创建一个ETLTask,其中LoadTask(以某种方式)不断获取并从ETLTask中取出部分结果(基本上将生产者和消费者分开)。我无法告诉AsyncResult这是否可行。听起来我只是想走下单独的生产者和消费者的道路,我不知道如何在芹菜中做。

class ExtractTransformTask(Task):

    def long_running_extract_transform(self):
        pass

    def run(self):
        return self.long_running_extract_transform()

class LoadTask(Task):

    def long_running_load(self):
        pass

    def run(self, results):
        self.long_running_load(results)

class ETLTask(Task):

    def run(self):
        et_result = ExtractTransformTask.delay()
        # while et_result PENDING or SUCCESS
        # dequeue current results and load with LoadTask instance

方法2

以块的形式提取源数据并创建多个加载任务。

1 个答案:

答案 0 :(得分:2)

使用方法2 解决方案。

class ExtractTransformMixin(object):

    def long_running_extract_transform(self, chunkify=False):
        pass

class LoadTask(Task):

    def long_running_load(self):
        pass

    def run(self, results):
        self.long_running_load(results)

class ETLTask(ExtractTransformMixin, Task):

    def run(self):
        load_results = ResultSet([])
        for chunk in long_running_extract_transform(chunkify=True):
            load_results.add(LoadTask().delay(chunk))
        return load_results