[英]Rust Async doesn't execute in parallel for sockets
我正在尝试使用 Rust 同时向多播 IP 发送和接收。
use futures::executor::block_on;
use async_std::task;
use std::{net::{UdpSocket, Ipv4Addr}, time::{Duration, Instant}};
fn main() {
let future = async_main();
block_on(future);
}
async fn async_main() {
let mut socket = UdpSocket::bind("0.0.0.0:8888").unwrap();
let multi_addr = Ipv4Addr::new(234, 2, 2, 2);
let inter = Ipv4Addr::new(0,0,0,0);
socket.join_multicast_v4(&multi_addr,&inter);
let async_one = first(&socket);
let async_two = second(&socket);
futures::join!(async_one, async_two);
}
async fn first(socket: &std::net::UdpSocket) {
let mut buf = [0u8; 65535];
let now = Instant::now();
loop {
if now.elapsed().as_secs() > 10 { break; }
let (amt, src) = socket.recv_from(&mut buf).unwrap();
println!("received {} bytes from {:?}", amt, src);
}
}
async fn second(socket: &std::net::UdpSocket) {
let now = Instant::now();
loop {
if now.elapsed().as_secs() > 10 { break; }
socket.send_to(String::from("h").as_bytes(), "234.2.2.2:8888").unwrap();
}
}
这个问题首先是运行接收 function 然后运行发送 function,它从不同时发送和接收。 使用 Golang,我可以使用 Goroutines 做到这一点,但我发现在 Rust 中这非常困难。
我对 Rust 中的async
不是很有经验,但是您的first()
和second()
函数中似乎没有任何异步调用——换句话说,没有任何使用.await
的调用。 我的理解是,如果什么都不等待,那么函数将同步运行,我相信您也会收到编译器警告。
它看起来不像std::net::UdpSocket
提供任何可以等待的异步方法,您需要改为使用async_std::net::UdpSocket
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.