我正在使用liburing对传入的C ++协程进行实验。
我是JavaScript开发人员,正在尝试实现Promise.all之类的功能>
我的第一次尝试
template <typename T> task<std::vector<T>> taskAll1(std::vector<task<T>> list) { std::vector<T> result; result.reserve(list.size()); for (auto&& t : list) { result.push_back(co_await t); } co_return result; }
task从gor_task修改而成。我主要将
task::promise_type::initial_suspend
returnsuspend_never
设置为默认启动协程。
用法:
task::promise_type::initial_suspend
该代码按预期工作。但是,如果我重新排列
suspend_never
的顺序,例如让// async_delay: https://github.com/CarterLi/liburing-http-demo/blob/12af992d0d87a721bbe67bb67aee8e4b0e965114/async_coro.hpp#L68 // It waits some seconds asynchronously and then prints the number of seconds it waits. task<bool> start() { // TODO: less verbose code? std::vector<task<int>> vec; vec.emplace_back(async_delay(1)); vec.emplace_back(async_delay(2)); vec.emplace_back(async_delay(3)); co_await taskAll<int>(std::move(vec)); co_return true; }
在emplace_back
之前,则代码仍然运行,但在程序结束时冻结。我知道这是因为任务async_delay(2)
在等待之前就已解决,但我不知道如何解决。
第二次尝试,我想做的是将下面的JS代码转换为C ++
async_delay(1)
C ++代码
async_delay(1)
该代码立即崩溃。异步代码真的很难调试,我放弃了。
完整代码/** @param {Promise<any>[]} list */
function taskAll(list) {
return new Promise(resolve => {
const result = new Array(list.length);
let left = list.length;
list.forEach((p, i) => {
p.then(x => {
result[i] = x;
left--;
if (!left) resolve(result);
})
});
});
}
,请提供帮助。
我正在尝试对传入的C ++协程进行解放。我是JavaScript开发人员,正在尝试实现Promise.all之类的功能。我的第一次尝试模板
对于第二次尝试,我发现我忘记分配由lambda表达式返回的任务,这使该任务在lambda函数返回后立即被破坏。