taskflow在cinder应用中,有参数传递的问题,针对这些参数是如何传递的,这里做一些简要的记录。具体原理还带深究。
代码如下:
import taskflow.engines
from taskflow.patterns import linear_flow
from cinder import flow_utils
class Task1(flow_utils.CinderTask):
""" test provider """
default_provides = set(['arg2'])
def __init__(self) -> None:
super(Task1, self).__init__(addons=['test'])
def execute(self,
**kwargs):
print("test Task1")
return {'arg2':"Provider arg2 from Task1"}
class Task2(flow_utils.CinderTask):
"""test require"""
def __init__(self) -> None:
requires = ['raw_size','arg2']
super(Task2, self).__init__(addons=['test'],
requires=requires)
def execute(self,
**kwargs):
print("test Task2")
for key,value in kwargs.items():
print(f"{key}:{value}")
class Task3(flow_utils.CinderTask):
"""test rebind"""
def __init__(self,arg3, **kwargs) -> None:
super(Task3, self).__init__(addons=['test'],
**kwargs)
self.arg3 = arg3
print(self.arg3)
def execute(self,size,
**kwargs):
print("test Task3")
print("the size is", size)
for key,value in kwargs.items():
print(f"{key}:{value}")
def get_flow(store):
flow_name = "test_api"
api_flow = linear_flow.Flow(flow_name)
arg3 = 123
api_flow.add(Task1())
api_flow.add(Task2())
api_flow.add(Task3(arg3,rebind={'size': 'raw_size'}))
return taskflow.engines.load(api_flow, store=store)
if __name__=='__main__':
store={'raw_size': 10}
engine = get_flow(store)
engine.run()
代码运行结果:
123
test Task1
test Task2
raw_size:10
arg2:Provider arg2 from Task1
test Task3
the size is 10
解析:
store:是总的传参,供所有的执行体从中取出所需参数
default_provides:返回本执行体的结果,并更新到store中,供后面其他执行体取参;例如Task1
例如代码:
class VolumeCastTask(flow_utils.CinderTask):
default_provides = set(['new_volume'])
def execute(self, context: context.RequestContext, **kwargs) -> None:
......
volume = self._call_create_volume(
context, request_spec, filter_properties)
return {'new_volume': volume}
这里得到new_volume,是返回结果。
vref = flow_engine.storage.fetch('new_volume')
然后从返回结果中取出该值
requires:代表本执行体所必须的参数,如果没有,则会报错;并且所需的参数会自动更新到**kwargs参数中,如果没有requires,也可以通过执行体中的execute函数通过显示调用具体的值来获取参数,如果执行,则不需要再显示获取,因为已经在**kwargs中了。例如Task2
rebind:重定向store中的参数名称,即和store中的参数做映射,例如Task3