我想为未来编写一些通用的重试逻辑。
我知道具体的返回类型,并且想在未来重试相同的操作。
我的代码只能访问未来 - 我不想将每个 fn 调用站点包装在闭包中以启用重新创建它。
似乎“未来”是 (fn, args) 的组合,并且当.await
被调用后,它会运行并等待结果。
如果我能够克隆所有参数,是否可以创建未启动的未来的克隆,以便在第一次失败时重试?
问题在于,尚未开始的未来与已经开始的未来是同一类型——未来会就地自我转变。所以虽然理论上Future
could be Clone
,这将对其整个生命周期中允许保持的状态施加严格的限制。对于期货实施async fn
不仅初始状态(传递给的参数async fn
) 不得不Clone
,而且所有交叉的局部变量也会如此.await
points.
一个简单的实验表明,当前async
不自动执行Clone
它的方式例如Send
,即使对于安全的异步函数也是如此。例如:
async fn retry(f: impl Future + Clone) {
todo!()
}
fn main() {
// fails to compile:
retry(async {});
// ^^^^^^^^ the trait `Clone` is not implemented for `impl Future`
}
我不想将每个 fn 调用站点包装在闭包中以启用重新创建它。
在这种情况下,这可能正是您需要做的。或者如果闭包需要太多样板文件,则使用某种宏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)