问题标签 [rust-futures]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
74 浏览

rust - 推送 SelectAll 流

我想要一个结构来处理一些流。所有流共享同一个 Item。逻辑如下:我需要创建一个独特的流,其中包含来自所有其他流的所有项目。我还需要将“新”流添加到“主”流中。我不在乎下一个项目来自哪个流。

为此,我看到select_all了应该执行上述逻辑的函数。

但我收到这些错误:

我究竟做错了什么?否则我如何存储多个流并对其进行迭代?

0 投票
1 回答
76 浏览

rust - 为什么 futures::lock::Mutex 没有实现 RefUnwindSafe

futures::lock::Mutex没有实现RefUnwindSafe特征(参见https://docs.rs/futures/0.3.17/futures/lock/struct.Mutex.html#impl-RefUnwindSafe

为什么不安全通过一个futures::lock::Mutex里面std::panic::catch_unwind

可重现的代码:

可以futures::lock::Mutex实现RefUnwindSafetrait 吗?

0 投票
1 回答
169 浏览

rust - 我怎样才能`fut.await`在“后台”运行未来(执行但不等待它)?

我希望能够在后台启动未来运行,而不是立即在父函数范围内等待它。

类似于动态的东西join_all,我可以在循环中将新期货添加到集合中,然后将集合传递给另一个函数,该函数可以等待整个集合(已经在运行)。

我希望能够做这样的事情:

但问题是:

  • .await开始执行未来,但也在当前函数处等待它
    • 如何在不等待的情况下开始执行?
  • &c不是'static
    • 似乎是所有 Tokio API 的要求,即“开始未来执行而不等待当前 fn 范围内的结果”,例如spawn_local
    • 如果所有期货都在一个线程上,那就可以了。

例子:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=85aa3a517bd1906b285f5a5586d7fa6d

0 投票
1 回答
27 浏览

rust - 手动期货和 aysnc 移动:即使我正在克隆类型,它的寿命也不够长

我有这个功能正在对手动创建的期货做一些工作。

我收到错误:

我不想做P静态,但我不介意克隆我的解决方案。我的理解是 usingasync move应该移动参数并获得所有权,所以我不需要 P 上的任何生命周期。但显然生命周期仍然存在一些奇怪的事情。

有什么建议么?

0 投票
1 回答
124 浏览

rust - 如何从同时工作的for循环中收集多个结果?

我想运行一个有很多不同变量的函数

假设我的功能是:

我想为许多输入运行这个函数;假设我的输入是

由于该函数花费了一些周期,我希望尽可能同时运行所有输入。所以我可以像这样运行

到目前为止,一切都很好; 我用这个函数运行了所有的输入并得到我的输出stdout。但是,如果我希望将输出写入某个输出文件怎么办?

我无法打开文件并在do_the_hard_job函数中附加到它。那会搞砸的。我无法将文件添加为参数,因为该方法将同时运行,哪个将借用可变文件。

我尝试返回值而不是在方法中打印,然后收集返回的值;像这样 :

可悲的是,这没有奏效。我可以尝试什么来实现我的目标?

编辑:我为这个问题准备了一个复制器:https ://github.com/kursatkobya/bite-sized-qualms/tree/main/concurrent-write

0 投票
2 回答
338 浏览

rust - 如何在不使用 OptionFuture 的情况下在 `Option::and_then` 或 `Option::map` 的闭包中使用 async/await?

我想运行类似下面的代码:

但它不起作用,因为 await 只能在异步块或函数中使用。另一方面,如果我使用异步块,则闭包将返回impl Future<Output = Option<_>>这是不允许的,因为Option::and_then只允许Option作为返回类型。

我知道的唯一选择是使用OptionFuture,创建一个中间变量,.map而不是.and_then.

但这确实很麻烦,并且使我无法使用许多可以对 Options、Results 或类似内容进行操作的函数,例如Option::and_then.

没有更好的办法吗?

0 投票
0 回答
99 浏览

rust - tokio::join 返回特征类型的映射期货有错误“`FnOnce` 的实现不够通用”

我已经开始了多项任务,tokio::spawn我想收集他们退出的原因dyn std::error::Error

如果任何任务恐慌,我想立即转发恐慌而不等待其他任务。为了实现这一点,我曾经在传播恐慌时futures::map展开。tokio::JoinHandle

然后我过去常常tokio::join!同时等待所有期货。

它给了我一个编译错误:

我正在与rustc 1.56.1 (59eed8a2a 2021-11-01). 我的 Cargo.toml 有:

我希望了解此错误或至少找到替代解决方案。

0 投票
1 回答
39 浏览

rust - 如何包装动态类型的流以方便 API?

我正在寻找为返回某种类型的任何流实现包装器结构,以减少乱扔我的应用程序的动态关键字。我遇到过BoxStream,但不知道如何在Stream::poll_next. 这是我到目前为止所拥有的:

依赖项:

期货=“0.3”

0 投票
1 回答
136 浏览

rust - 等待同一个未来时,Rust 需要静态生命周期吗?

我正在尝试从服务器获取 OAuth 令牌,所以我创建了一个名为Token. 为了在令牌过期时只保留一个请求,我为请求的未来保留了一个参考,让其他请求继续等待它返回。游乐场

我对生命周期错误感到困惑:

我不想保持静止;我希望它的生命周期与结构相同。

  1. 是解决问题的正常方法吗?
  2. 如何更正代码?
0 投票
0 回答
78 浏览

asynchronous - Rust 方法链和异步助手

我还在学习 Rust,我正在做的一个练习是移植一个我在其他语言中使用过的“流利的构建器”~esque 模式。例如:

允许我编写一个端点处理程序,例如:

不幸的是,上面的类型签名CalculationResult::log_to_file是一个谎言。它实际上不需要消耗self。原来它只需要&self为了能够登录到文件。但是,为了保持流畅的风格,我们仍然需要 return self。该怎么办?

重构 1:拯救的特征

更新log_to_file以拥有其真正的签名

并添加一点 trait 魔法来提供“副作用”辅助方法

现在处理程序可以写成:

很容易,但下一个挑战随之而来。假设我们想要将信息保存到数据库,而不是记录到本地文件。

重构 2:进入异步

CalculationResult现在可以将自己保存到远程数据库中,而不是记录到文件中:

我想更新处理程序以适应这种异步副作用,同时保持流畅界面的精神完好无损:

不幸的是,这就是我在 Rust 方面的技能达不到要求的地方。直觉上,我认为这是可能的,因为最终会CalculationResult比未来更长久persist

问题:你如何实现一个AsyncSideEffect特征?

您如何更新SideEffect以便它可以采用产生的函数Future<Output=Result<(), E>>?如果async特性中允许使用函数,它可能是这样的:

但是您今天在 Rust Stable 2021 中如何做到这一点?

编辑:缩小范围(无特征助手)

与其在特征中处理异步功能的开销,让我们通过引入一个结构来将其简化为一个更简单的情况,我们可以在其中添加一个异步函数到它的impl

更新处理程序以显式构建此帮助器对象,如下所示:

导致编译器给出一个生命周期错误:

是否可以Holder使用生命周期注释或额外的块来更新 struct 或 impl 以使其编译?