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秒左右都是同时返回。但是结果是阻塞同步执行的。不知道哪里写错了。
1
共 8 条评论, 1 页
评论区
写评论在同一个协程中收总是在阻塞,如何将收发放到不同的协程中去?例如udpsocket
谢谢,明白了
--
👇
gwy15: 你对协程的理解不太对,协程是非抢占式(协作式)多线程,也就是说是主动yield执行权而不是让调度器调度;你这里虽然 yield 出去了执行权,但是只有一个线程在执行,所以还是会等待五秒才会继续执行。
如果要达到你想要的的效果,需要创建多个协程。
spawn应该是对应于go
你对协程的理解不太对,协程是非抢占式(协作式)多线程,也就是说是主动yield执行权而不是让调度器调度;你这里虽然 yield 出去了执行权,但是只有一个线程在执行,所以还是会等待五秒才会继续执行。
如果要达到你想要的的效果,需要创建多个协程。
谢谢
--
👇
sinsay: 拿到 stream 后要 spawn 一个新的 Task 去处理你的逻辑。
谢谢
--
👇
jetli: 看下官方demo吧: https://github.com/async-rs/async-std/blob/f09fa42042805b02c6a211d64e8cdee82ea773ff/examples/tcp-echo.rs#L33
看下官方demo吧: https://github.com/async-rs/async-std/blob/f09fa42042805b02c6a211d64e8cdee82ea773ff/examples/tcp-echo.rs#L33
拿到 stream 后要 spawn 一个新的 Task 去处理你的逻辑。