我有一个自定义运算符,它按下面的方式推送XCOM值:
...
task_instance = context['task_instance']
task_instance.xcom_push("list_of_files",file_list)
...
工作正常。我有一个dag定义文件(my_dag.py),我使用自己的运算符创建一个任务,它推动XCOM值然后我想通过使用此xcom值进行循环。怎么拉?
答案 0 :(得分:1)
您无法访问dag中的XCOM变量,它只能在运算符中通过向运算符构造函数提供provide_context=True
参数来提供。
如果您想在DAG结构中使用来自操作员的数据,则需要执行操作员在操作员外部执行的实际任务。
def get_file_list():
hook = SomeHook()
hook.run('something to get file list')
dag = DAG('tutorial', default_args=default_args)
for file in get_file_list():
task = SomeOperator(params={'file': file}) # Do something with the file passed as a parameter
答案 1 :(得分:0)
从dag本身而不是dag中的任务访问xcom通常是一种不好的做法。也就是说,有时是必要的。例如,在动态创建dag时可能需要执行此操作。
这是我在拖延中拉出一些未执行的工作的示例。我在subdag的上下文中使用它,因此可以放心,假设该方法正在运行,xcom将始终包含该信息。
xcom_unrun_jobs = None
if len(parent_dag.get_active_runs()) > 0:
tis = parent_dag.get_task_instances(settings.Session, start_date=parent_dag.get_active_runs()[-1])[-1]
xcom_unrun_jobs = tis.xcom_pull(dag_id=parent_dag._dag_id, task_ids=unrun_job_task_id)