< 返回版块

hb475721797 发表于 2020-10-10 16:59

use async_std::net::{TcpListener};
use async_std::io;
use async_std::prelude::*;

fn main()  ->io::Result<()>{
    async_std::task::block_on(block()).unwrap();
    Ok(())
}

async fn block() ->io::Result<()> {
    let listen = TcpListener::bind("127.0.0.1:9090").await?;
    let mut incoming = listen.incoming();
    while let Some(stream) = incoming.next().await {
        let mut stream = stream?;

        let mut buff = vec![0;2];
        stream.read(&mut buff).await?;
        let a = std::str::from_utf8(& buff).unwrap().as_bytes();
        async_std::task::sleep(std::time::Duration::from_secs(5)).await;
        println!("{:?}",a);
        let b:Vec<u8> = vec![5,6];
        stream.write(b.as_slice()).await.unwrap();
    }


    Ok(())
}

我用golang同时发送多个请求,必须每次等待5秒才能返回下一个请求(第二次就是10秒),我的理解是 async_std::task::sleep(std::time::Duration::from_secs(5)).await 不会阻塞线程的,应该发多次请求,差不多5秒左右都是同时返回。但是结果是阻塞同步执行的。不知道哪里写错了。

评论区

写评论
iincity 2020-10-27 08:41

在同一个协程中收总是在阻塞,如何将收发放到不同的协程中去?例如udpsocket

作者 hb475721797 2020-10-12 09:05

谢谢,明白了

--
👇
gwy15: 你对协程的理解不太对,协程是非抢占式(协作式)多线程,也就是说是主动yield执行权而不是让调度器调度;你这里虽然 yield 出去了执行权,但是只有一个线程在执行,所以还是会等待五秒才会继续执行。

如果要达到你想要的的效果,需要创建多个协程。

Krysme 2020-10-11 11:05

spawn应该是对应于go

gwy15 2020-10-10 18:51

你对协程的理解不太对,协程是非抢占式(协作式)多线程,也就是说是主动yield执行权而不是让调度器调度;你这里虽然 yield 出去了执行权,但是只有一个线程在执行,所以还是会等待五秒才会继续执行。

如果要达到你想要的的效果,需要创建多个协程。

作者 hb475721797 2020-10-10 17:32

谢谢

--
👇
sinsay: 拿到 stream 后要 spawn 一个新的 Task 去处理你的逻辑。

作者 hb475721797 2020-10-10 17:32

谢谢

--
👇
jetli: 看下官方demo吧: https://github.com/async-rs/async-std/blob/f09fa42042805b02c6a211d64e8cdee82ea773ff/examples/tcp-echo.rs#L33

jetli 2020-10-10 17:11

看下官方demo吧: https://github.com/async-rs/async-std/blob/f09fa42042805b02c6a211d64e8cdee82ea773ff/examples/tcp-echo.rs#L33

sinsay 2020-10-10 17:09

拿到 stream 后要 spawn 一个新的 Task 去处理你的逻辑。

1 共 8 条评论, 1 页