Rust 如何通过接收器发送项目列表?
我有一个通过期货发送的项目列表::Rust 如何通过接收器发送项目列表?,rust,future,Rust,Future,我有一个通过期货发送的项目列表::Sink: let mut list = VecDeque::new(); /* add a bunch of Packet items to list */ let (sink, stream) = tcp_stream.framed(PacketCodec).split(); 我可以用电子邮件发送一个包裹 if let Some(first) = list.pop_front() { sink.send(first); } 如何发送整个列表?当使
Sink
:
let mut list = VecDeque::new();
/* add a bunch of Packet items to list */
let (sink, stream) = tcp_stream.framed(PacketCodec).split();
我可以用电子邮件发送一个包裹
if let Some(first) = list.pop_front() {
sink.send(first);
}
如何发送整个列表?当使用新软件时,我发现在深入研究之前阅读文档非常有用。一般来说,锈菌群落提供了大量的资源 例如,Tokio项目有一个。这一点在这里也是无价的 我建议所有程序员学习的另一件事是创建一个问题的解决方案。这使他们能够专注于问题的核心,同时也消除了问题背后的陈词滥调。这里有一个例子:
use futures::{Sink, SinkExt}; // 0.3.4
fn thing(mut sink: impl Sink<i32>) {
let mut all_the_things = vec![1, 2, 3, 4, 5];
while let Some(v) = all_the_things.pop() {
sink.send(v);
}
}
从这里,我们可以看到,send
要求类型实现Unpin
,因此让我们更改一下:
use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;
fn thing(mut sink: impl Sink<i32> + Unpin) {
let mut all_the_things = vec![1, 2, 3, 4, 5];
while let Some(v) = all_the_things.pop() {
sink.send(v);
}
}
再次查看API,我们看到它返回一个值。这很奇怪,不是吗?这其实并不奇怪,一旦你看到Send
实现了Future
——如果流已经满了,将某些东西推到流中可能会阻塞;这就是背压的概念。将结果设置为未来,这样您就可以知道项目何时实际添加到流中
一种解决方案是通过.wait
和编写函数async
,来推动未来的发展:
use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;
async fn thing(mut sink: impl Sink<i32> + Unpin) {
let mut all_the_things = vec![1, 2, 3, 4, 5];
while let Some(v) = all_the_things.pop() {
sink.send(v)
.await
.unwrap_or_else(|_| panic!("Unable to send item"));
}
}
“以下显然不起作用”-怎么会这样?您能否包括错误,或描述您看到的行为?在询问堆栈溢出问题时,请生成一个。我打赌丢失的错误消息表示预期的
T
,发现的&T
。如果是这样的话,我强烈建议你回去重读一遍,因为这对Tokio来说不是问题,而是基本的锈迹所有权。对不起,我添加的代码在概念上无法表达我想要的东西,但由于很多原因,包括所有权和寿命问题,它无法工作。我发现这是一种干扰,而不是概念上的说明,所以我将删除它。答案很好!他也是一个神奇的指针。它肯定需要在谷歌进行升级。我一直在使用这些资料、文档和一些博客来了解tokio。我相信谷歌的排名会稳步攀升;东京0.1毕竟是两周前才发布的!谢谢你的详细回答。这让我感到有些意外,关于为什么你会故意设计一个API来利用Rust的移动语义。@PeterHall太棒了!我不是100%确定,但我认为在这种情况下,移动语义也有助于期货的“零额外成本”方面。
use futures::{Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;
async fn thing(mut sink: impl Sink<i32> + Unpin) {
let mut all_the_things = vec![1, 2, 3, 4, 5];
while let Some(v) = all_the_things.pop() {
sink.send(v)
.await
.unwrap_or_else(|_| panic!("Unable to send item"));
}
}
use futures::{stream, Sink, SinkExt}; // 0.3.4
use std::marker::Unpin;
async fn thing(mut sink: impl Sink<i32> + Unpin) {
let all_the_things = vec![1, 2, 3, 4, 5];
let mut stream = stream::iter(all_the_things.into_iter().map(Ok));
sink.send_all(&mut stream)
.await
.unwrap_or_else(|_| panic!("Unable to send item"));
}