gpt4 book ai didi

rust - 如何同时运行包含借来的TcpStream的 future ?

转载 作者:行者123 更新时间:2023-12-03 11:37:53 24 4
gpt4 key购买 nike

我正在尝试使此代码段同时运行,而不是顺序运行,因为对等点的数量可能很大。我正在使用async_std 1.4和rust 1.41

pub struct Peer {
pub peer_id: String,
pub tcp_stream: Arc<TcpStream>,
pub public_key: [u8; 32],
}

async fn send_to_all_peers(message: Protocol, peers: &HashMap<String,Peer>) -> Result<()> {
for peer in peers.values() {
let mut stream = &*peer.tcp_stream;
stream.write_all(&bincode::serialize(&message)?).await?;
}
Ok(())
}

我尝试使用 futures::future::join_all方法没有任何运气,因为包装在 async_std::task::spawn中创建和使用的将来需要一个静态生命期。这是我尝试过的:

async fn send_to_all_peers(message: Protocol, peers: &HashMap<String,Peer>) {
let handles = peers.values().into_iter().map(|peer| {
task::spawn(
async {
let mut stream = &*peer.tcp_stream;
if let Err(err) = stream
.write_all(&bincode::serialize(&message).unwrap())
.await
{
error!("Error when writing to tcp_stream: {}", err);
}
}
)
});
futures::future::join_all(handles).await;
}

我确定我缺少某种方法,谢谢您的帮助!

最佳答案

由于您尝试同时发送消息,因此每个任务都必须拥有自己的消息副本:

use async_std::{task, net::TcpStream};
use futures::{future, io::AsyncWriteExt};
use serde::Serialize;
use std::{
collections::HashMap,
error::Error,
sync::Arc,
};

pub struct Peer {
pub peer_id: String,
pub tcp_stream: Arc<TcpStream>,
pub public_key: [u8; 32],
}

#[derive(Serialize)]
struct Protocol;

async fn send_to_all_peers(
message: Protocol,
peers: &HashMap<String, Peer>)
-> Result<(), Box<dyn Error>>
{
let msg = bincode::serialize(&message)?;
let handles = peers.values()
.map(|peer| {
let msg = msg.clone();
let socket = peer.tcp_stream.clone();
task::spawn(async move {
let mut socket = &*socket;
socket.write_all(&msg).await
})
});

future::try_join_all(handles).await?;
Ok(())
}

关于rust - 如何同时运行包含借来的TcpStream的 future ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60025114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com