sogou/workflow

基于counter实现多入边节点(node为什么基于WFCounterTask实现)

zhouchunliang opened this issue · 1 comments

第一类问题:WFGraphNode是DAG 其中的一个节点(node),但为什么是基于WFCounterTask类实现的(node和WFCounterTask难道有什么关系吗);WFContainerTask也是基于WFCounterTask实现的,能否也解释下?多入边的节点都需要一个counter实现,这是有什么历史背景吗?还是有和渊源?我理解一个DAG 包含多个node(每个node其实就是一个任务),但是不清楚workflow中基于WFCounterTask类实现的node是基于何种场景考虑的?(node为什么基于WFCounterTask实现?)
第二类问题(仅仅是个人建议):在具体的task实现中,FileIOTask等类似的任务实现是在WFTaskFactory.cc中实现的,能否可以像HttpTaskInpl.cc似的,单独弄一个文件完成FileIOTask的实现,其他任务实现也类似这么做(目前实现了http,redis等常规的)(这样的好处是比较容易理解,通过文件了解整体框架脉络(一层一层继承),比较清楚);

先解释一下counter的功能。counter是一种任务,任务的完成条件是对它进行count的次数达到目标值。任务完成时callback被调用。目标值为1的counter,可以理解成一个塞子,把当前的任务流堵住,用户在任何时候通过count操作把塞子打开。有了这个功能,我们就可以在server里引用其它异步引擎,在操作完成之后打开塞子,server任务流继续执行。
DAG里用到counter是因为每个任务的完成都会影响到后续几个任务,所以一般的实现就是任务callback里count多个counter,当某个counter到达目标值,后续任务被启动。
关于counter的更多详细文档,可以参考这个https://github.com/sogou/workflow/blob/master/docs/about-counter.md
至于WFContainerTask,是想用来做数据传递的,给每条边上加入一个模板型的参数。但现在还没有怎么用起来。
简单的DAG构造你用WFGraphTask就可以了,程序这样写:

WFGraphTask *graph = WFTaskFactory::create_graph_task(graph_callback);
task1 = WFTaskFactory::create_some_task(...);
task2 = WFTaskFactory::create_some_task(...);
task3 = WFTaskFactory::create_some_task(...);
task4 = WFTaskFactory::create_some_task(...);
WFGraphNode& node1 = graph->create_graph_node(task1);
WFGraphNode& node2 = graph->create_graph_node(task2);
WFGraphNode& node3 = graph->create_graph_node(task3);
WFGraphNode& node4 = graph->create_graph_node(task4);
/* Build the graph. */
node1-->node2;
node1-->node3;
node2-->node4;
node3-->node4;

graph->start();

上以代码通过直观的方式描述了节点之间的依赖关系。