我希望链接我的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
以块的形式提取源数据并创建多个加载任务。
答案 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