async_simple icon indicating copy to clipboard operation
async_simple copied to clipboard

怎么在collectAny后再继续等待其他RescheduleLazy执行完毕

Open obqrn opened this issue 1 year ago • 10 comments

怎么在collectAny后,再继续等待其他未完成的RescheduleLazy事务执行完毕, 或者换个方式,怎么使用collectAll时,主动捕获任一RescheduleLazy事务的返回或异常进行自定义操作。 因为我的RescheduleLazy很多,如果每个都包装嵌套一个Lazy进行处理很麻烦且不美观。 希望能得到帮助,感谢。

obqrn avatar Jun 04 '24 08:06 obqrn

不太理解你的问题,现在我们没有实现取消,所以 collectAny 里的所有任务都是会执行完成的。

如果想要对 Lazy 任务的执行结果进行操作,这里还是推荐用 Lazy 再包一层,再传入这个 Lazy

ChuanqiXu9 avatar Jun 04 '24 08:06 ChuanqiXu9

其实我想做的就是,在执行多个RescheduleLazy时其中一个执行异常了,需要通知所有关联Lazy主动退出,并且等待所有Lazy执行完毕,再进行下一步操作。 不知道有没有好的方法。

obqrn avatar Jun 04 '24 08:06 obqrn

如果collectAll能有一个任一任务执行完毕的回调设置就能解决我的问题

obqrn avatar Jun 04 '24 08:06 obqrn

这样的话,可能得加个 API 才行,现在的 API 做起来比较麻烦

ChuanqiXu9 avatar Jun 04 '24 09:06 ChuanqiXu9

如果后续有计划支持的话那就太感谢了哈!

obqrn avatar Jun 04 '24 09:06 obqrn

我们最近可能不一定有时间,你有需求的话我记得可以仿照这个 https://github.com/alibaba/async_simple/commit/6be48e7b3edde61a8a4e7ca432d25a8d9840153c#diff-176b2550085ca9ac5fc1358dda6fa81b9acfa3cb05e947fb23efc7dd135481af 实现下

ChuanqiXu9 avatar Jun 04 '24 09:06 ChuanqiXu9

感谢指导哈,学习学习

obqrn avatar Jun 05 '24 00:06 obqrn

其实我想做的就是,在执行多个RescheduleLazy时其中一个执行异常了,需要通知所有关联Lazy主动退出,并且等待所有Lazy执行完毕,再进行下一步操作。 不知道有没有好的方法。

典型的取消操作

poor-circle avatar Nov 08 '24 10:11 poor-circle

其实我想做的就是,在执行多个RescheduleLazy时其中一个执行异常了,需要通知所有关联Lazy主动退出,并且等待所有Lazy执行完毕,再进行下一步操作。 不知道有没有好的方法。

典型的取消操作

#402 给出了初步设计方案。 通过执行

  co_await collectAll<CancellationType::terminal>(work1(),work2());

第一个返回的任务会触发取消信号。尝试取消尚未完成的任务。

取消是协作式的,需要异步IO对象/调度器支持取消操作,或者手动检查。

async_simple所有自带的组件会在将来支持取消操作,并抛出std::system_error{std::errc::operation_canceled}异常。

实现一个支持取消的sleep的简单例子:

Lazy<bool> sleep_1s() {
    CancellationSlot* slot = co_await currentCancellationSlot{};
    auto p = std::make_unique<Promise<void>>();
    auto waiter = p.getFuture();
    if (slot) {
        if (!slot->emplace([p=std::move(p)](CancellationType type){
            p.notity();
        })) {
            // signal has triggered
            co_return;
        }
    }
    co_await waiter.waitFor(1s);
}

poor-circle avatar Nov 15 '24 12:11 poor-circle

已合入主线。 See doc

poor-circle avatar Jan 14 '25 09:01 poor-circle