繁体   English   中英

Rust 异步不会并行执行 sockets

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM