Rust 如何用Tokio经纬仪处理WouldBlock错误?

Rust 如何用Tokio经纬仪处理WouldBlock错误?,rust,rust-tokio,Rust,Rust Tokio,考虑以下代码: extern crate tokio; // Executor runtime use tokio::prelude::*; use tokio::net::TcpListener; use std::net::SocketAddr; fn main() { let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap(); let listener = TcpListener::bind(&am

考虑以下代码:

extern crate tokio; // Executor runtime

use tokio::prelude::*;
use tokio::net::TcpListener;
use std::net::SocketAddr;

fn main() {
    let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap();
    let listener = TcpListener::bind(&addr)
        .expect("unable to bind TCP listener");
    tokio::run(listener.incoming()
        .map_err(|e| eprintln!("failed to accept socket; error = {:?}", e))
        .for_each(|mut socket| {
            let mut buf = vec![];
            socket.read_to_end(&mut buf).unwrap();
            println!("Received: {:#?}", buf);
            Ok(())
        })
    );
}
我想有一种方法可以将套接字置于阻塞模式,或者捕获错误并对其进行处理。我想知道处理这个问题的标准、规范的方法是什么


我不希望阻塞,因为我希望服务器在等待客户端时做其他事情,所以异步/线程解决方案将是非常棒的。

您使用的是Tokio库,它的全部目的是启用异步IO。您永远不希望在异步事件循环中执行阻塞操作

相反,要么完全采用异步,要么完全避免异步,使用更简单、更粗糙的线程

Tokio公司创造了一个能够从一个插座读取所有数据的未来:

use std::net::SocketAddr;
use tokio::{net::TcpListener, prelude::*}; // 0.1.22

fn main() {
    let addr = "127.0.0.1:8118".parse::<SocketAddr>().unwrap();
    let listener = TcpListener::bind(&addr).expect("unable to bind TCP listener");

    tokio::run(
        listener
            .incoming()
            .and_then(|s| tokio::io::read_to_end(s, vec![]))
            .map_err(|e| panic!("failed: {:?}", e))
            .for_each(|(_socket, buf)| {
                println!("Received: {:#?}", buf);
                Ok(())
            }),
    );
}
使用std::net::SocketAddr;
使用东京::{net::TcpListener,前奏曲::*};//0.1.22
fn main(){
让addr=“127.0.0.1:8118”。解析::()。展开();
let listener=TcpListener::bind(&addr).expect(“无法绑定TCP侦听器”);
东京:快跑(
听众
.incoming()
然后(| s | tokio::io::read|u to|u end(s,vec![]))
.map_err(| e | panic!(“失败:{:?}”,e))
.对于每个(|(|插座,buf)|{
println!(“收到:{:#?}”,buf);
好(())
}),
);
}
另见:


将我的套接字置于阻塞模式的某种方法-也许你不想使用Tokio,因为它的存在的全部目的是允许异步IO…我不希望IO阻塞应用程序的其余部分,所以我想要异步或线程。更具体地说,服务器应该能够坐在那里听东西(稍后将其添加到频道),而服务器的其余部分继续做东西。