问题标签 [rust-async-std]

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 投票
2 回答
106 浏览

asynchronous - 如何使用 async_std::task::sleep 模拟阻塞操作?

我有一个像这样的简单代码来模拟异步代码如何在阻塞操作上工作。

我希望所有这些“Hello”打印将在 1000 毫秒后显示。

但是这段代码就像一个普通的阻塞代码一样工作,每个 hello_wait 调用等待 1000 毫秒并在 1000 毫秒后打印另一个 Hello。

我怎样才能让它同时运行?

这是正在发生的事情:

这就是我想要的:

0 投票
1 回答
45 浏览

rust - 如何在向量中存储具有相同签名的 2 个不同异步函数的期货

如何在向量中存储具有相同签名的 2 个不同异步函数的期货?

我在不同的箱子中有 2 个功能:

板条箱 1:

板条箱 2:

我试图聚合函数调用的结果,如下所示:

但我得到了这个:

为什么rust不能推断类型?

0 投票
1 回答
50 浏览

rust - 在使用 async_std 实现聊天服务器时,是否可以将全局客户端向量存储为不安全?

我已经实现了一个聊天服务器,它存储连接的用户,如果用户发送消息,服务器会将其回显给所有其他客户端。

我有 C++ 背景,所以我创建了一个全局static mut USERS:Vec<TcpStream>变量来存储和访问用户。

我正在处理来自 main() 的连接用户,如下所示:

功能on_connection是:

像这样使用 Rust 可以吗?

我想让应用程序安全并使用 Rust 的安全环境而没有“不安全”。但是我不知道如何存储全局用户以供以后访问而不会不安全。

0 投票
0 回答
77 浏览

rust - 无法将结果流收集到未来结果中

给定函数返回每个项目可能失败的流:

我想将它的结果展平为像这样的项目向量的结果的未来,

我希望将 Stream 展平为 Future 是一项微不足道的任务,但 Rust 的编译器却用另一个神秘的错误让我望而却步。

我尝试避免try_collect并在结果出现时循环遍历结果:

但它抱怨我的流没有固定。如果我尝试通过以下方式固定我的流:

然后我再次收到“不可发送”错误。

0 投票
0 回答
65 浏览

asynchronous - 如何在 Rust 中使用每个文件单独的锁来锁定异步文件写入?

我有一个基于 actix 的 API,它完全异步运行。有一个端点,它在文件系统上写入具有用户给定文件名的文件(我使用 async-std 库进行异步 fs 操作)。

我现在的问题是,每当两个调用修改同一个文件时,我都会遇到竞争条件。我不想要一个锁定每次写入的“全局”互斥锁,因为这会无缘无故地人为地减慢我的应用程序。

是否有可能为每个文件获取一个锁,以便只锁定和解锁这个特定文件的写操作?

0 投票
1 回答
51 浏览

rust - 跨线程移动任务时 Rust Async Executor 内存排序保证?

这是关于 Rust 异步生态系统内的内存排序保证的一个相当基本的问题。但是,我似乎在任何地方都找不到明确的答案。

C++ 内存排序从基于线程的角度指定内存排序:

发布-获取排序

如果线程 A 中的原子存储标记为 memory_order_release,并且线程 B 中来自同一变量的原子加载标记为 memory_order_acquire,则从线程的角度来看,在原子存储之前发生的所有内存写入(非原子和宽松原子) A,在线程 B 中成为可见的副作用。也就是说,一旦原子加载完成,线程 B 保证可以看到线程 A 写入内存的所有内容。

各种 Rust 异步执行器支持跨线程移动任务.await。一个自然的场景是:

  1. Relaxed任务 A 位于线程 1 并在变量 处执行存储x
  2. 任务 A.await命中
  3. 任务 A 被移动到线程 2 并被唤醒。Release然后在变量处执行存储y
  4. 任务 B 位于线程 3 并在变量处执行Acquire加载y

问题是:线程 1 的存储是否保证在加载Relaxed后在任务 B 中可见?Acquire例如,如果线程 3 的任务 B之后Relaxed在变量处执行了负载x,是否可以保证任务 A 的副作用是可见的?

这应该取决于每个异步执行器的任务调度程序中同步机制的实现。任何熟悉它们的人都会受到赞赏。

0 投票
3 回答
49 浏览

rust - AsyncRead 中的超时不会超时

我正在尝试实现一个异步读取包装器,它将添加读取超时功能。目标是 API 是普通的AsyncRead。换句话说,我不想在代码的每个地方都添加 io.read(buf).timeout(t)。相反,读取实例本身应io::ErrorKind::TimedOut在给定超时到期后返回适当的值。

不过,我无法轮询delay到就绪。它始终处于待处理状态。我试过用async-std, futures, smol-timeout- 同样的结果。虽然超时确实在等待时触发,但在轮询时不会触发。我知道超时并不容易。需要一些东西来唤醒它。我究竟做错了什么?如何度过难关?

0 投票
0 回答
63 浏览

postgresql - 等待静态数据

我正在连接到数据库。插入凭据后,连接器会返回一个(client, connection)元组。之后,程序宏必须访问某个“全局位置”,从那里检索凭据并将数据连接到生成的代码中。

我试过这样的事情:

我不能.await在静态上下文中。是否有解决方法来保存RuntimeDataon的数据RUNTIME_DATA

我试图避免调用 DatabaseConnection::new()每个 proc-macro 使用,因为它会解析配置文件中的凭据并将它们连接到实例中。我看到 Rust 做得非常快,即使我认为它的效率很低。如果我可以在静态上下文中存储一次凭据,我可以避免为每个 proc-macro 使用分配多个实例。

我的数据库处理程序是:

编辑 clarifiyinPitaJ方法:

0 投票
0 回答
11 浏览

rust - 对等方重置连接。东京,选择

我正在编写 socks5 代理服务器。该程序正在异步运行,我正在尝试使用tokio::select,但是当我想获取接收数据的大小时,程序由于此错误而终止:

发生错误的函数: