问题标签 [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.
rust - Rust 流式传输管道
我发现 Rust 流式文档很复杂,并且不存在示例。
尝试创建代码示例可能比概述问题更令人困惑。
给定一个正在传递给消费函数的读取流,我想在流管道中引入一个中间步骤,它可以计算字节数,但可以做任何事情,而且开销最小。
read stream --> middle read stream function --> write stream
示例管道:
首先获取文件流,然后对流执行转换,最后流到磁盘(新文件)。
rust - 如何实现来自未来函数的流
为了理解流是如何工作的,我试图实现一个使用 random.org 的无限数生成器。我做的第一件事是实现一个版本,在该版本中我会调用一个名为 get_number 的异步函数,它会填充一个缓冲区并返回下一个可能的数字:
通过这个实现,我可以get_number
在循环中调用该函数并获取我想要的任意数量的数字,但我的想法是拥有迭代器,这样我就可以调用一堆组合函数,如take
,take_while
等。
但是,当我尝试实现 Stream 时,问题开始出现:我的第一次尝试是创建一个包含对生成器的引用的结构
然后我实现了以下 Stream
但调用它只会挂起进程
在接下来的尝试中,我尝试使用 pin_mut 在流结构上保持未来状态!但最终在生命周期中出现了许多错误而无法解决它们。在这种情况下可以做什么?这是一个没有流的工作代码:
在这里您可以找到第一个工作示例的链接(而不是调用 random.org,我使用了光标,因为 dns 分辨率在操场上不起作用)https://play.rust-lang.org/?version=stable&mode =debug&edition=2018&gist=730eaf1f7db842877d3f3e7ca1c6d2a5
我最后一次尝试使用流,你可以在这里找到https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=de0b212ee70865f6ac6c19430cd952cd
rust - Rust,如何执行基本的递归异步?
我只是在做一些快速的实验以尝试学习 rust 语言,我已经完成了一些成功的异步测试,这是我的起点:
通过改变 you 的值chunks
可以改变有多少task::spawn
s。现在,我希望函数不是一组扁平的工作人员,而是add_range
递归的,并根据输入继续分叉工作人员,但是在编译器错误之后,我让自己很纠结:
我已经玩了一段时间了,但我觉得我只是因为编译器错误而变得越来越迷失。
rust - 如何使用 tokio、async-std 并行化几分钟
我想使用 tokio 或 async-std 在多线程中执行以下处理。我已经阅读了关于 tokio 和 async-std 的教程,但我认为没有提到并行化 for。在这个过程中,所有线程都引用同一个数组索引。此外,所有线程都将访问同一数组的不同位置。
我想将上述代码的部分更改为并行处理。
asynchronous - Rust - 如何在一个应用程序中使用同步和异步 crate
我开始使用Druid crate 和Crabler crate 编写程序来制作我可以探索其数据的网络抓取应用程序。在我花了一段时间构建这个程序很久之后,我才意识到合并同步和异步编程是一个坏主意。我现在要做的是在应用程序打开时运行刮板(最好是每小时一次)。
现在刮板直到应用程序关闭后才会运行。我尝试使用 Tokiospawn
创建一个在应用程序打开之前启动的单独线程,但这不起作用,因为 Crabler 未来没有“发送”特性。
我试图制作一个最小的功能程序,如下所示。没有按预期运行,title_handler
但它表明了我遇到的问题。
是否可以在应用程序打开时允许 WebScraper 运行?如果是这样,怎么做?
编辑:我尝试使用task::spawn_blocking()
来运行应用程序,但它抛出了大量错误,包括 druid 没有实现 trait Send
。
asynchronous - 如何在异步上下文中访问全局资源?
我一直在编写一个带有tide
框架async-std
风格的小型 Web 服务。该项目使用一个很少使用但贯穿整个项目的数据库。
我认为将它声明为全局变量是合理的,这样我就不必在几乎每个函数接口中都包含它,只是为了让它在未使用的情况下传递。在与编译器就我违反的 Rust 设计原则的数量进行了一番争论之后,我确定了以下声明:
const_rwlock()
是来自crate的常量Rwlock
构造函数(据我所知,与 on nightly 相同)并且是我自己的类型,稍后会填充连接详细信息并以异步方式处理数据库的实际通信和初始化。parking_lot
RwLock
Database
一切看起来都很好,因为我可以像这样使用它:
即使在异步函数中使用异步方法。
当我尝试将此功能传递给 Web 框架时,就会出现问题。我应该通过传入一个必须是的异步块闭包来做到这一点Send
,但是当我写这样的东西时:
我得到一个错误,因为整个未来不再是Send
. 这对我来说很有意义,因为我在.read()
调用中锁定了一个互斥体,然后将整个事情打包到未来并等待它。这意味着锁定的互斥锁可能会被发送到另一个线程,这似乎并不明智。
这让我认为我设计了整个全局变量是错误的,我没有更好的想法。
什么是表示异步代码中许多地方使用的资源的好方法?我想避免“无处不在”的路线。
这是一个最小的代码示例。我从板条箱中提取了相关代码tide
以尝试缩小此问题的范围。
货物.toml:
在它上面运行后cargo check
,我得到了描述的错误:
我相信我在高级别正确解释了此错误(无法在线程之间移动锁保护),并且在此错误消息中在低级别(*mut ()
不是)进行了解释。Send
rust - 存储对“异步”函数的引用
我想将指向异步函数的指针存储在一些静态列表中,然后再调用它们。我怎样才能做到这一点?例如
是非异步函数的工作版本。
我该如何实现这一点,以便我可以在这个操场async
上取消注释和await
喜欢到非工作版本?
rust - 类型相同时,Rust 中的“一种类型比另一种更通用”错误
我有以下代码
此外,您可以在Rust Playground上在线运行它。
出现以下错误:
现在,这真的很奇怪,因为它清楚地表明它正在得到它所期望的。我不明白哪种类型比哪种更通用。我对生命周期的了解不足以调试此代码。有人可以对此有更多的了解吗?
rust - 为什么我的匹配块中需要发送特征?
我认为我的问题与Rust Issue 57017 有关。
以下代码error: future cannot be sent between threads safely
由于future created by async block is not 'Send'
源自async fn execute_fail
. _ 另一方面,async fn execute_work
编译并具有相同的功能和逻辑,execute_fail
但方式不太优雅。
给出:
我想解释一下为什么execute_fail
不按原样编译execute_work
。编译器注释note: future is not
Send as this value is used across an await
对我来说没有意义,因为我看不到在 await 中如何使用任何值。
rust - 在 rust 中的两个异步函数之间进行选择的变量 - 不兼容的 arm 类型
我有一个变量可以控制哪个函数是我的 Web 应用程序的默认行为,但这两个函数都是async
并且它不会让我这样做,因为它们是不同的闭包。这样的事情会重现相同的错误:
https ://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=db0269ef4852a94438e6d4925ca83d3b
现在我的问题是:
- 我该如何解决这个问题以便匹配有效?
- 有没有更好的方法可以根据用户 CLI 标志以编程方式在 actix 上设置默认服务器行为?对于上下文,这或多或少是我所拥有的:
main.rs
handlers.rs