sogou/workflow

创建好任务流之后.在任务流执行完之前,如何优雅的提前退出这个任务流?

myseemylife opened this issue · 5 comments

如题:
1.已经start的任务 不可以再用dismiss.
2.TimerTask 不可用dimiss.

已经start的任务,是不可以dismiss的,这个真没办法太复杂了。但你说提前结束series,这个是支持的啊,series有个cancel()接口,可以在任务的callback里调,可以直接干掉series里还没有执行的任务。
timer task不能手动提前返回,但是,timer task不影响程序退出,程序退出可以让所有timer返回,状态码为WFT_STATE_ABORTED。也就是说飞出去的timer虽然不能提前callback,但用户是可以完全不管的。

@Barenboim 感谢大佬回复,
就是说
1.已经start的task.框架现在不推荐强制结束. 最好是等已经start的task自己跑完.然后再退出,
2.没有start的任务自己手动dismiss.
3.series cancle之后在callbakc中遍历series中剩余的subTask.挨个dismiss就可以了对吧

@Barenboim 感谢大佬回复,
就是说
1.已经start的task.框架现在不推荐强制结束. 最好是等已经start的task自己跑完.然后再退出,
2.没有start的任务自己手动dismiss.
3.series cancle之后在callbakc中遍历series中剩余的subTask.挨个dismiss就可以了对吧

第3点,不是的呀,dismiss只能是任务流没有运行之前调用。
直接在某个任务的callback里,cancel它所在的series,无需再dismiss:

void http_callback(WFHttpTask *task)
{
    SeriesWork *series = series_of(task);
    series->cancel();
}

这样series里其他任务就不执行直接没了,也不会callback。但series的callback还是会调用:

void series_callback(const SeriesWork *series)
{
    bool canceled = series->is_canceled(); /* 'true' if the series was canceled. */
    ...
}

这个方法可以比较完备的运行中取消整个任务图,例如,我们希望parallel的某个series分枝被cancel时,继续取消parallel所在任务流,可以在parallel callback里进行检查:

void parallel_callback(const ParallelWork *pwork)
{
    bool canceled = false;

    for (size_t i = 0; i < pwork->size(); i++)
    {
        canceled = pwork->series_at(i)->is_canceled();
        if (canceled)
            break;
    }

    if (canceled)
        series_of(pwork)->cancel();

    ...
}

一切都是递归。

Cool!原来cancle是这么用的~感谢大佬指点

先不关issue吧。这个问题还比较有用。