Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜:从上一个任务异步检索部分结果_Python_Celery_Etl - Fatal编程技术网

Python 芹菜:从上一个任务异步检索部分结果

Python 芹菜:从上一个任务异步检索部分结果,python,celery,etl,Python,Celery,Etl,我想链接我的ETL工作流,加载任务可以异步地流式传输ExtractTransform任务的部分结果,而不必等待ExtractTransform完成。芹菜可以吗 我正在考虑两种方法: 方法1 创建一个ETLTask,其中LoadTask(以某种方式)不断从ETLTask获取部分结果并将其出列(本质上分离生产者和消费者)。我从照片上看不出这是否可能。听起来我只是想走一条生产商和消费者分开的道路,我不知道如何在芹菜中做到这一点 class ExtractTransformTask(Task):

我想链接我的ETL工作流,加载任务可以异步地流式传输ExtractTransform任务的部分结果,而不必等待ExtractTransform完成。芹菜可以吗

我正在考虑两种方法:

方法1

创建一个ETLTask,其中LoadTask(以某种方式)不断从ETLTask获取部分结果并将其出列(本质上分离生产者和消费者)。我从照片上看不出这是否可能。听起来我只是想走一条生产商和消费者分开的道路,我不知道如何在芹菜中做到这一点

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


分块提取源数据并创建多个加载任务。

使用方法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